diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 6341b6b6008..f6ee79c07d4 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -8,18 +8,18 @@ repos: hooks: # ----- Packaging Requirements ------------------------------------------------------------------------------------> -## - id: pip-tools-compile -## alias: compile-pkg-linux-3.6-zmq-requirements -## name: Linux Packaging Py3.6 ZeroMQ Requirements -## files: ^requirements/((base|zeromq|crypto)\.txt|static/pkg/(linux\.in|py3\.6/linux\.txt))$ -## pass_filenames: false -## args: -## - -v -## - --py-version=3.6 -## - --platform=linux -## - --include=requirements/base.txt -## - --include=requirements/zeromq.txt -## - requirements/static/pkg/linux.in + - id: pip-tools-compile + alias: compile-pkg-linux-3.6-zmq-requirements + name: Linux Packaging Py3.6 ZeroMQ Requirements + files: ^requirements/((base|zeromq|crypto)\.txt|static/pkg/(linux\.in|py3\.6/linux\.txt))$ + pass_filenames: false + args: + - -v + - --py-version=3.6 + - --platform=linux + - --include=requirements/base.txt + - --include=requirements/zeromq.txt + - requirements/static/pkg/linux.in - id: pip-tools-compile alias: compile-pkg-linux-3.7-zmq-requirements @@ -200,22 +200,22 @@ repos: # <---- Packaging Requirements ------------------------------------------------------------------------------------- # ----- CI Requirements -------------------------------------------------------------------------------------------> -## - id: pip-tools-compile -## alias: compile-ci-linux-3.6-zmq-requirements -## name: Linux CI Py3.6 ZeroMQ Requirements -## files: ^requirements/((base|zeromq|pytest)\.txt|static/((ci|pkg)/(linux\.in|common\.in)|pkg/py3\.6/linux\.txt))$ -## pass_filenames: false -## args: -## - -v -## - --py-version=3.6 -## - --platform=linux -## - --include=requirements/base.txt -## - --include=requirements/zeromq.txt -## - --include=requirements/pytest.txt -## - --include=requirements/static/pkg/linux.in -## - --include=requirements/static/ci/common.in -## - --pip-args=--constraint=requirements/static/pkg/py{py_version}/linux.txt -## - requirements/static/ci/linux.in + - id: pip-tools-compile + alias: compile-ci-linux-3.6-zmq-requirements + name: Linux CI Py3.6 ZeroMQ Requirements + files: ^requirements/((base|zeromq|pytest)\.txt|static/((ci|pkg)/(linux\.in|common\.in)|pkg/py3\.6/linux\.txt))$ + pass_filenames: false + args: + - -v + - --py-version=3.6 + - --platform=linux + - --include=requirements/base.txt + - --include=requirements/zeromq.txt + - --include=requirements/pytest.txt + - --include=requirements/static/pkg/linux.in + - --include=requirements/static/ci/common.in + - --pip-args=--constraint=requirements/static/pkg/py{py_version}/linux.txt + - requirements/static/ci/linux.in - id: pip-tools-compile alias: compile-ci-linux-3.7-zmq-requirements @@ -285,18 +285,18 @@ repos: - --pip-args=--constraint=requirements/static/pkg/py{py_version}/linux.txt - requirements/static/ci/linux.in -## - id: pip-tools-compile -## alias: compile-ci-linux-crypto-3.6-requirements -## name: Linux CI Py3.6 Crypto Requirements -## files: ^requirements/(crypto\.txt|static/ci/(crypto\.in|py3\.6/linux-crypto\.txt))$ -## pass_filenames: false -## args: -## - -v -## - --py-version=3.6 -## - --platform=linux -## - --out-prefix=linux -## - --pip-args=--constraint=requirements/static/ci/py{py_version}/linux.txt -## - requirements/static/ci/crypto.in + - id: pip-tools-compile + alias: compile-ci-linux-crypto-3.6-requirements + name: Linux CI Py3.6 Crypto Requirements + files: ^requirements/(crypto\.txt|static/ci/(crypto\.in|py3\.6/linux-crypto\.txt))$ + pass_filenames: false + args: + - -v + - --py-version=3.6 + - --platform=linux + - --out-prefix=linux + - --pip-args=--constraint=requirements/static/ci/py{py_version}/linux.txt + - requirements/static/ci/crypto.in - id: pip-tools-compile alias: compile-ci-linux-crypto-3.7-requirements @@ -651,21 +651,21 @@ repos: # ----- Cloud CI Requirements -------------------------------------------------------------------------------------> -## - id: pip-tools-compile -## alias: compile-ci-cloud-3.6-requirements -## name: Cloud CI Py3.6 Requirements -## files: ^requirements/((base|zeromq|pytest)\.txt|static/(pkg/linux\.in|ci/((cloud|common)\.in|py3\.6/cloud\.txt)))$ -## pass_filenames: false -## args: -## - -v -## - --py-version=3.6 -## - --include=requirements/base.txt -## - --include=requirements/zeromq.txt -## - --include=requirements/pytest.txt -## - --include=requirements/static/pkg/linux.in -## - --include=requirements/static/ci/common.in -## - --pip-args=--constraint=requirements/static/pkg/py{py_version}/linux.txt -## - requirements/static/ci/cloud.in + - id: pip-tools-compile + alias: compile-ci-cloud-3.6-requirements + name: Cloud CI Py3.6 Requirements + files: ^requirements/((base|zeromq|pytest)\.txt|static/(pkg/linux\.in|ci/((cloud|common)\.in|py3\.6/cloud\.txt)))$ + pass_filenames: false + args: + - -v + - --py-version=3.6 + - --include=requirements/base.txt + - --include=requirements/zeromq.txt + - --include=requirements/pytest.txt + - --include=requirements/static/pkg/linux.in + - --include=requirements/static/ci/common.in + - --pip-args=--constraint=requirements/static/pkg/py{py_version}/linux.txt + - requirements/static/ci/cloud.in - id: pip-tools-compile alias: compile-ci-cloud-3.7-requirements @@ -733,22 +733,22 @@ repos: # <---- Cloud CI Requirements -------------------------------------------------------------------------------------- # ----- Doc CI Requirements ---------------------------------------------------------------------------------------> -## - id: pip-tools-compile -## alias: compile-doc-requirements -## name: Docs CI Py3.6 Requirements -## files: ^requirements/((base|zeromq|pytest)\.txt|static/ci/(docs|common|linux)\.in|static/pkg/linux\.in|static/pkg/.*/linux\.txt)$ -## pass_filenames: false -## args: -## - -v -## - --py-version=3.6 -## - --platform=linux -## - --include=requirements/base.txt -## - --include=requirements/zeromq.txt -## - --include=requirements/static/pkg/linux.in -## - --include=requirements/static/ci/linux.in -## - --include=requirements/static/ci/common.in -## - --pip-args=--constraint=requirements/static/ci/py{py_version}/linux.txt -## - requirements/static/ci/docs.in + - id: pip-tools-compile + alias: compile-doc-requirements + name: Docs CI Py3.6 Requirements + files: ^requirements/((base|zeromq|pytest)\.txt|static/ci/(docs|common|linux)\.in|static/pkg/linux\.in|static/pkg/.*/linux\.txt)$ + pass_filenames: false + args: + - -v + - --py-version=3.6 + - --platform=linux + - --include=requirements/base.txt + - --include=requirements/zeromq.txt + - --include=requirements/static/pkg/linux.in + - --include=requirements/static/ci/linux.in + - --include=requirements/static/ci/common.in + - --pip-args=--constraint=requirements/static/ci/py{py_version}/linux.txt + - requirements/static/ci/docs.in - id: pip-tools-compile alias: compile-doc-requirements @@ -821,22 +821,22 @@ repos: # <---- Doc CI Requirements ---------------------------------------------------------------------------------------- # ----- Lint CI Requirements --------------------------------------------------------------------------------------> -## - id: pip-tools-compile -## alias: compile-ci-lint-3.6-requirements -## name: Lint CI Py3.6 Requirements -## files: ^requirements/((base|zeromq)\.txt|static/(pkg/linux\.in|ci/(linux\.in|common\.in|lint\.in|py3\.6/linux\.txt)))$ -## pass_filenames: false -## args: -## - -v -## - --py-version=3.6 -## - --platform=linux -## - --include=requirements/base.txt -## - --include=requirements/zeromq.txt -## - --include=requirements/static/pkg/linux.in -## - --include=requirements/static/ci/linux.in -## - --include=requirements/static/ci/common.in -## - --pip-args=--constraint=requirements/static/ci/py{py_version}/linux.txt -## - requirements/static/ci/lint.in + - id: pip-tools-compile + alias: compile-ci-lint-3.6-requirements + name: Lint CI Py3.6 Requirements + files: ^requirements/((base|zeromq)\.txt|static/(pkg/linux\.in|ci/(linux\.in|common\.in|lint\.in|py3\.6/linux\.txt)))$ + pass_filenames: false + args: + - -v + - --py-version=3.6 + - --platform=linux + - --include=requirements/base.txt + - --include=requirements/zeromq.txt + - --include=requirements/static/pkg/linux.in + - --include=requirements/static/ci/linux.in + - --include=requirements/static/ci/common.in + - --pip-args=--constraint=requirements/static/ci/py{py_version}/linux.txt + - requirements/static/ci/lint.in - id: pip-tools-compile alias: compile-ci-lint-3.7-requirements @@ -909,17 +909,17 @@ repos: # <---- Lint CI Requirements --------------------------------------------------------------------------------------- # ----- Changelog -------------------------------------------------------------------------------------------------> -## - id: pip-tools-compile -## alias: compile-ci-changelog-3.6-requirements -## name: Changelog CI Py3.6 Requirements -## files: ^requirements/static/ci/(changelog\.in|py3\.6/(changelog|linux)\.txt)$ -## pass_filenames: false -## args: -## - -v -## - --py-version=3.6 -## - --platform=linux -## - --pip-args=--constraint=requirements/static/ci/py{py_version}/linux.txt -## - requirements/static/ci/changelog.in + - id: pip-tools-compile + alias: compile-ci-changelog-3.6-requirements + name: Changelog CI Py3.6 Requirements + files: ^requirements/static/ci/(changelog\.in|py3\.6/(changelog|linux)\.txt)$ + pass_filenames: false + args: + - -v + - --py-version=3.6 + - --platform=linux + - --pip-args=--constraint=requirements/static/ci/py{py_version}/linux.txt + - requirements/static/ci/changelog.in - id: pip-tools-compile alias: compile-ci-changelog-3.7-requirements @@ -971,16 +971,16 @@ repos: # <---- Changelog -------------------------------------------------------------------------------------------------- # ----- Invoke ----------------------------------------------------------------------------------------------------> -## - id: pip-tools-compile -## alias: compile-ci-invoke-3.6-requirements -## name: Linux CI Py3.6 Invoke Requirements -## files: ^requirements/static/ci/(invoke\.in|py3.6/(invoke|linux)\.txt)$ -## pass_filenames: false -## args: -## - -v -## - --py-version=3.6 -## - --pip-args=--constraint=requirements/static/ci/py{py_version}/linux.txt -## - requirements/static/ci/invoke.in + - id: pip-tools-compile + alias: compile-ci-invoke-3.6-requirements + name: Linux CI Py3.6 Invoke Requirements + files: ^requirements/static/ci/(invoke\.in|py3.6/(invoke|linux)\.txt)$ + pass_filenames: false + args: + - -v + - --py-version=3.6 + - --pip-args=--constraint=requirements/static/ci/py{py_version}/linux.txt + - requirements/static/ci/invoke.in - id: pip-tools-compile alias: compile-ci-invoke-3.7-requirements @@ -1186,6 +1186,8 @@ repos: - distro==1.7.0 - jinja2==3.0.3 - msgpack==1.0.3 + - packaging + - looseversion - repo: https://github.com/saltstack/invoke-pre-commit rev: v1.9.0 @@ -1203,6 +1205,8 @@ repos: - distro==1.7.0 - jinja2==3.0.3 - msgpack==1.0.3 + - packaging + - looseversion - repo: https://github.com/saltstack/invoke-pre-commit rev: v1.9.0 @@ -1224,6 +1228,8 @@ repos: - distro==1.7.0 - jinja2==3.0.3 - msgpack==1.0.3 + - packaging + - looseversion - repo: https://github.com/saltstack/invoke-pre-commit rev: v1.9.0 @@ -1245,6 +1251,8 @@ repos: - distro==1.7.0 - jinja2==3.0.3 - msgpack==1.0.3 + - packaging + - looseversion - repo: https://github.com/saltstack/invoke-pre-commit rev: v1.9.0 @@ -1268,6 +1276,8 @@ repos: - distro==1.7.0 - jinja2==3.0.3 - msgpack==1.0.3 + - packaging + - looseversion - repo: https://github.com/pre-commit/mirrors-mypy rev: v0.971 diff --git a/.pylintrc b/.pylintrc index 3ea58194c0f..6e57ff6a4f7 100644 --- a/.pylintrc +++ b/.pylintrc @@ -696,7 +696,8 @@ allowed-3rd-party-modules=msgpack, tempfile, fnmatch, ptscripts, - packaging + packaging, + looseversion [EXCEPTIONS] diff --git a/requirements/base.txt b/requirements/base.txt index c5da13107bb..c19d8804a2b 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -6,6 +6,7 @@ MarkupSafe requests>=1.0.0 distro>=1.0.1 psutil>=5.0.0 - +packaging>=21.3 +looseversion # We need contextvars for salt-ssh contextvars diff --git a/requirements/static/ci/py3.10/cloud.txt b/requirements/static/ci/py3.10/cloud.txt index 2d9dc8ccdad..052a41ebc97 100644 --- a/requirements/static/ci/py3.10/cloud.txt +++ b/requirements/static/ci/py3.10/cloud.txt @@ -485,6 +485,8 @@ kubernetes==3.0.0 # via -r requirements/static/ci/common.in libnacl==1.8.0 ; sys_platform != "win32" and sys_platform != "darwin" # via -r requirements/static/ci/common.in +looseversion==1.0.2 + # via -r requirements/base.txt lxml==4.9.1 # via # junos-eznc @@ -622,7 +624,9 @@ oauthlib==3.2.1 oscrypto==1.2.1 # via certvalidator packaging==21.3 - # via pytest + # via + # -r requirements/base.txt + # pytest paramiko==2.10.1 ; sys_platform != "win32" and sys_platform != "darwin" # via # -r requirements/static/ci/common.in diff --git a/requirements/static/ci/py3.10/darwin.txt b/requirements/static/ci/py3.10/darwin.txt index 413513b7f38..c3da8d26945 100644 --- a/requirements/static/ci/py3.10/darwin.txt +++ b/requirements/static/ci/py3.10/darwin.txt @@ -486,6 +486,8 @@ kubernetes==3.0.0 # via -r requirements/static/ci/common.in linode-python==1.1.1 # via -r requirements/darwin.txt +looseversion==1.0.2 + # via -r requirements/base.txt lxml==4.9.1 # via # junos-eznc @@ -621,7 +623,9 @@ oauthlib==3.2.1 oscrypto==1.2.0 # via certvalidator packaging==21.3 - # via pytest + # via + # -r requirements/base.txt + # pytest paramiko==2.10.1 # via # junos-eznc diff --git a/requirements/static/ci/py3.10/docs.txt b/requirements/static/ci/py3.10/docs.txt index 0be07618867..fb50afb06b6 100644 --- a/requirements/static/ci/py3.10/docs.txt +++ b/requirements/static/ci/py3.10/docs.txt @@ -492,6 +492,8 @@ kubernetes==3.0.0 # via -r requirements/static/ci/common.in libnacl==1.8.0 ; sys_platform != "win32" and sys_platform != "darwin" # via -r requirements/static/ci/common.in +looseversion==1.0.2 + # via -r requirements/base.txt lxml==4.9.1 # via # junos-eznc @@ -622,6 +624,7 @@ oscrypto==1.2.1 # via certvalidator packaging==21.3 # via + # -r requirements/base.txt # ansible-core # sphinx paramiko==2.10.1 ; sys_platform != "win32" and sys_platform != "darwin" diff --git a/requirements/static/ci/py3.10/freebsd.txt b/requirements/static/ci/py3.10/freebsd.txt index d855b06652f..154956976b6 100644 --- a/requirements/static/ci/py3.10/freebsd.txt +++ b/requirements/static/ci/py3.10/freebsd.txt @@ -483,6 +483,8 @@ kubernetes==3.0.0 # via -r requirements/static/ci/common.in libnacl==1.7.1 ; sys_platform != "win32" and sys_platform != "darwin" # via -r requirements/static/ci/common.in +looseversion==1.0.2 + # via -r requirements/base.txt lxml==4.9.1 # via # junos-eznc @@ -616,7 +618,9 @@ oauthlib==3.2.1 oscrypto==1.2.0 # via certvalidator packaging==21.3 - # via pytest + # via + # -r requirements/base.txt + # pytest paramiko==2.10.1 ; sys_platform != "win32" and sys_platform != "darwin" # via # -r requirements/static/ci/common.in diff --git a/requirements/static/ci/py3.10/lint.txt b/requirements/static/ci/py3.10/lint.txt index 0da039cd496..0b9d0c4067a 100644 --- a/requirements/static/ci/py3.10/lint.txt +++ b/requirements/static/ci/py3.10/lint.txt @@ -486,6 +486,8 @@ lazy-object-proxy==1.4.3 # via astroid libnacl==1.8.0 ; sys_platform != "win32" and sys_platform != "darwin" # via -r requirements/static/ci/common.in +looseversion==1.0.2 + # via -r requirements/base.txt lxml==4.9.1 # via # junos-eznc @@ -619,7 +621,9 @@ oauthlib==3.2.1 oscrypto==1.2.1 # via certvalidator packaging==21.3 - # via ansible-core + # via + # -r requirements/base.txt + # ansible-core paramiko==2.10.1 ; sys_platform != "win32" and sys_platform != "darwin" # via # -r requirements/static/ci/common.in diff --git a/requirements/static/ci/py3.10/linux.txt b/requirements/static/ci/py3.10/linux.txt index 4308d394f8f..9911e5ecec8 100644 --- a/requirements/static/ci/py3.10/linux.txt +++ b/requirements/static/ci/py3.10/linux.txt @@ -500,6 +500,8 @@ kubernetes==3.0.0 # via -r requirements/static/ci/common.in libnacl==1.7.1 ; sys_platform != "win32" and sys_platform != "darwin" # via -r requirements/static/ci/common.in +looseversion==1.0.2 + # via -r requirements/base.txt lxml==4.9.1 # via # junos-eznc @@ -631,6 +633,7 @@ oscrypto==1.2.0 # via certvalidator packaging==21.3 # via + # -r requirements/base.txt # ansible-core # pytest paramiko==2.10.1 ; sys_platform != "win32" and sys_platform != "darwin" diff --git a/requirements/static/ci/py3.10/windows.txt b/requirements/static/ci/py3.10/windows.txt index e805a59d470..fba90a472fd 100644 --- a/requirements/static/ci/py3.10/windows.txt +++ b/requirements/static/ci/py3.10/windows.txt @@ -158,6 +158,8 @@ keyring==5.7.1 # via -r requirements/static/ci/common.in kubernetes==3.0.0 # via -r requirements/static/ci/common.in +looseversion==1.0.2 + # via -r requirements/base.txt lxml==4.9.1 # via -r requirements/windows.txt mako==1.2.2 @@ -192,7 +194,9 @@ multidict==6.0.2 ntlm-auth==1.5.0 # via requests-ntlm packaging==21.3 - # via pytest + # via + # -r requirements/base.txt + # pytest passlib[bcrypt]==1.7.4 # via -r requirements/static/ci/common.in patch==1.16 diff --git a/requirements/static/ci/py3.6/cloud.txt b/requirements/static/ci/py3.6/cloud.txt index e7a9d2908c9..78d64e04c7b 100644 --- a/requirements/static/ci/py3.6/cloud.txt +++ b/requirements/static/ci/py3.6/cloud.txt @@ -502,6 +502,8 @@ kubernetes==3.0.0 # via -r requirements/static/ci/common.in libnacl==1.8.0 ; sys_platform != "win32" and sys_platform != "darwin" # via -r requirements/static/ci/common.in +looseversion==1.0.3 + # via -r requirements/base.txt lxml==4.9.1 # via # junos-eznc @@ -641,7 +643,9 @@ oauthlib==3.2.1 oscrypto==1.2.1 # via certvalidator packaging==21.3 - # via pytest + # via + # -r requirements/base.txt + # pytest paramiko==2.10.1 ; sys_platform != "win32" and sys_platform != "darwin" # via # -r requirements/static/ci/common.in @@ -687,7 +691,7 @@ pyopenssl==20.0.1 # via # -r requirements/static/pkg/linux.in # etcd3-py -pyparsing==3.0.9 +pyparsing==3.0.6 # via # junos-eznc # packaging diff --git a/requirements/static/ci/py3.6/docs.txt b/requirements/static/ci/py3.6/docs.txt index 613a849fb9b..33135136876 100644 --- a/requirements/static/ci/py3.6/docs.txt +++ b/requirements/static/ci/py3.6/docs.txt @@ -511,6 +511,8 @@ kubernetes==3.0.0 # via -r requirements/static/ci/common.in libnacl==1.8.0 ; sys_platform != "win32" and sys_platform != "darwin" # via -r requirements/static/ci/common.in +looseversion==1.0.3 + # via -r requirements/base.txt lxml==4.9.1 # via # junos-eznc @@ -643,6 +645,7 @@ oscrypto==1.2.1 # via certvalidator packaging==21.3 # via + # -r requirements/base.txt # ansible-core # sphinx paramiko==2.10.1 ; sys_platform != "win32" and sys_platform != "darwin" @@ -691,7 +694,7 @@ pyopenssl==19.1.0 # via # -r requirements/static/pkg/linux.in # etcd3-py -pyparsing==3.0.9 +pyparsing==3.0.6 # via # junos-eznc # packaging diff --git a/requirements/static/ci/py3.6/lint.txt b/requirements/static/ci/py3.6/lint.txt index 891d701c193..c91bb312e20 100644 --- a/requirements/static/ci/py3.6/lint.txt +++ b/requirements/static/ci/py3.6/lint.txt @@ -507,6 +507,8 @@ lazy-object-proxy==1.4.3 # via astroid libnacl==1.8.0 ; sys_platform != "win32" and sys_platform != "darwin" # via -r requirements/static/ci/common.in +looseversion==1.0.3 + # via -r requirements/base.txt lxml==4.9.1 # via # junos-eznc @@ -642,7 +644,9 @@ oauthlib==3.2.1 oscrypto==1.2.1 # via certvalidator packaging==21.3 - # via ansible-core + # via + # -r requirements/base.txt + # ansible-core paramiko==2.10.1 ; sys_platform != "win32" and sys_platform != "darwin" # via # -r requirements/static/ci/common.in @@ -693,7 +697,7 @@ pyopenssl==20.0.1 # via # -r requirements/static/pkg/linux.in # etcd3-py -pyparsing==3.0.9 +pyparsing==3.0.6 # via # junos-eznc # packaging diff --git a/requirements/static/ci/py3.6/linux.txt b/requirements/static/ci/py3.6/linux.txt index 5cbf3b15287..48a79d92da3 100644 --- a/requirements/static/ci/py3.6/linux.txt +++ b/requirements/static/ci/py3.6/linux.txt @@ -517,6 +517,8 @@ kubernetes==3.0.0 # via -r requirements/static/ci/common.in libnacl==1.7.1 ; sys_platform != "win32" and sys_platform != "darwin" # via -r requirements/static/ci/common.in +looseversion==1.0.3 + # via -r requirements/base.txt lxml==4.9.1 # via # junos-eznc @@ -650,6 +652,7 @@ oscrypto==1.2.0 # via certvalidator packaging==21.3 # via + # -r requirements/base.txt # ansible-core # pytest paramiko==2.10.1 ; sys_platform != "win32" and sys_platform != "darwin" @@ -706,7 +709,7 @@ pyopenssl==19.1.0 # via # -r requirements/static/pkg/linux.in # etcd3-py -pyparsing==3.0.9 +pyparsing==3.0.6 # via # junos-eznc # packaging diff --git a/requirements/static/ci/py3.7/cloud.txt b/requirements/static/ci/py3.7/cloud.txt index 5424dbac2e5..dd4b73e9ba2 100644 --- a/requirements/static/ci/py3.7/cloud.txt +++ b/requirements/static/ci/py3.7/cloud.txt @@ -511,6 +511,8 @@ libnacl==1.8.0 ; sys_platform != "win32" and sys_platform != "darwin" # via -r requirements/static/ci/common.in loguru==0.6.0 # via ciscoconfparse +looseversion==1.0.2 + # via -r requirements/base.txt lxml==4.9.1 # via # junos-eznc @@ -661,7 +663,9 @@ oauthlib==3.2.1 oscrypto==1.2.1 # via certvalidator packaging==21.3 - # via pytest + # via + # -r requirements/base.txt + # pytest paramiko==2.10.1 ; sys_platform != "win32" and sys_platform != "darwin" # via # -r requirements/static/ci/common.in diff --git a/requirements/static/ci/py3.7/docs.txt b/requirements/static/ci/py3.7/docs.txt index 302542aef7b..df9b63c879a 100644 --- a/requirements/static/ci/py3.7/docs.txt +++ b/requirements/static/ci/py3.7/docs.txt @@ -516,6 +516,8 @@ libnacl==1.8.0 ; sys_platform != "win32" and sys_platform != "darwin" # via -r requirements/static/ci/common.in loguru==0.6.0 # via ciscoconfparse +looseversion==1.0.2 + # via -r requirements/base.txt lxml==4.9.1 # via # junos-eznc @@ -660,6 +662,7 @@ oscrypto==1.2.1 # via certvalidator packaging==21.3 # via + # -r requirements/base.txt # ansible-core # sphinx paramiko==2.10.1 ; sys_platform != "win32" and sys_platform != "darwin" diff --git a/requirements/static/ci/py3.7/freebsd.txt b/requirements/static/ci/py3.7/freebsd.txt index 6862654f787..fa5dfc7120a 100644 --- a/requirements/static/ci/py3.7/freebsd.txt +++ b/requirements/static/ci/py3.7/freebsd.txt @@ -508,6 +508,8 @@ kubernetes==3.0.0 # via -r requirements/static/ci/common.in libnacl==1.7.1 ; sys_platform != "win32" and sys_platform != "darwin" # via -r requirements/static/ci/common.in +looseversion==1.0.2 + # via -r requirements/base.txt lxml==4.9.1 # via # junos-eznc @@ -651,7 +653,9 @@ oauthlib==3.2.1 oscrypto==1.2.0 # via certvalidator packaging==21.3 - # via pytest + # via + # -r requirements/base.txt + # pytest paramiko==2.10.1 ; sys_platform != "win32" and sys_platform != "darwin" # via # -r requirements/static/ci/common.in diff --git a/requirements/static/ci/py3.7/lint.txt b/requirements/static/ci/py3.7/lint.txt index 9a295e5c044..f49bc460008 100644 --- a/requirements/static/ci/py3.7/lint.txt +++ b/requirements/static/ci/py3.7/lint.txt @@ -512,6 +512,8 @@ libnacl==1.8.0 ; sys_platform != "win32" and sys_platform != "darwin" # via -r requirements/static/ci/common.in loguru==0.6.0 # via ciscoconfparse +looseversion==1.0.2 + # via -r requirements/base.txt lxml==4.9.1 # via # junos-eznc @@ -659,7 +661,9 @@ oauthlib==3.2.1 oscrypto==1.2.1 # via certvalidator packaging==21.3 - # via ansible-core + # via + # -r requirements/base.txt + # ansible-core paramiko==2.10.1 ; sys_platform != "win32" and sys_platform != "darwin" # via # -r requirements/static/ci/common.in diff --git a/requirements/static/ci/py3.7/linux.txt b/requirements/static/ci/py3.7/linux.txt index 284ab83365c..d941657e6ee 100644 --- a/requirements/static/ci/py3.7/linux.txt +++ b/requirements/static/ci/py3.7/linux.txt @@ -523,6 +523,8 @@ kubernetes==3.0.0 # via -r requirements/static/ci/common.in libnacl==1.7.1 ; sys_platform != "win32" and sys_platform != "darwin" # via -r requirements/static/ci/common.in +looseversion==1.0.2 + # via -r requirements/base.txt lxml==4.9.1 # via # junos-eznc @@ -664,6 +666,7 @@ oscrypto==1.2.0 # via certvalidator packaging==21.3 # via + # -r requirements/base.txt # ansible-core # pytest paramiko==2.10.1 ; sys_platform != "win32" and sys_platform != "darwin" diff --git a/requirements/static/ci/py3.7/windows.txt b/requirements/static/ci/py3.7/windows.txt index 7b7ea7274b5..5fb70d5b75b 100644 --- a/requirements/static/ci/py3.7/windows.txt +++ b/requirements/static/ci/py3.7/windows.txt @@ -174,6 +174,8 @@ keyring==5.7.1 # via -r requirements/static/ci/common.in kubernetes==3.0.0 # via -r requirements/static/ci/common.in +looseversion==1.0.2 + # via -r requirements/base.txt lxml==4.9.1 # via -r requirements/windows.txt mako==1.2.2 @@ -207,7 +209,9 @@ multidict==6.0.2 ntlm-auth==1.5.0 # via requests-ntlm packaging==21.3 - # via pytest + # via + # -r requirements/base.txt + # pytest passlib[bcrypt]==1.7.4 # via -r requirements/static/ci/common.in patch==1.16 diff --git a/requirements/static/ci/py3.8/cloud.txt b/requirements/static/ci/py3.8/cloud.txt index 0dc69b722f2..9adae10fae9 100644 --- a/requirements/static/ci/py3.8/cloud.txt +++ b/requirements/static/ci/py3.8/cloud.txt @@ -500,6 +500,8 @@ libnacl==1.8.0 ; sys_platform != "win32" and sys_platform != "darwin" # via -r requirements/static/ci/common.in loguru==0.6.0 # via ciscoconfparse +looseversion==1.0.2 + # via -r requirements/base.txt lxml==4.9.1 # via # junos-eznc @@ -650,7 +652,9 @@ oauthlib==3.2.1 oscrypto==1.2.1 # via certvalidator packaging==21.3 - # via pytest + # via + # -r requirements/base.txt + # pytest paramiko==2.10.1 ; sys_platform != "win32" and sys_platform != "darwin" # via # -r requirements/static/ci/common.in diff --git a/requirements/static/ci/py3.8/docs.txt b/requirements/static/ci/py3.8/docs.txt index a2b44ac86cb..1e1a9aa4ab4 100644 --- a/requirements/static/ci/py3.8/docs.txt +++ b/requirements/static/ci/py3.8/docs.txt @@ -507,6 +507,8 @@ libnacl==1.8.0 ; sys_platform != "win32" and sys_platform != "darwin" # via -r requirements/static/ci/common.in loguru==0.6.0 # via ciscoconfparse +looseversion==1.0.2 + # via -r requirements/base.txt lxml==4.9.1 # via # junos-eznc @@ -651,6 +653,7 @@ oscrypto==1.2.1 # via certvalidator packaging==21.3 # via + # -r requirements/base.txt # ansible-core # sphinx paramiko==2.10.1 ; sys_platform != "win32" and sys_platform != "darwin" diff --git a/requirements/static/ci/py3.8/freebsd.txt b/requirements/static/ci/py3.8/freebsd.txt index b27cb9d7c0d..8d952a3e5fe 100644 --- a/requirements/static/ci/py3.8/freebsd.txt +++ b/requirements/static/ci/py3.8/freebsd.txt @@ -498,6 +498,8 @@ kubernetes==3.0.0 # via -r requirements/static/ci/common.in libnacl==1.7.1 ; sys_platform != "win32" and sys_platform != "darwin" # via -r requirements/static/ci/common.in +looseversion==1.0.2 + # via -r requirements/base.txt lxml==4.9.1 # via # junos-eznc @@ -641,7 +643,9 @@ oauthlib==3.2.1 oscrypto==1.2.0 # via certvalidator packaging==21.3 - # via pytest + # via + # -r requirements/base.txt + # pytest paramiko==2.10.1 ; sys_platform != "win32" and sys_platform != "darwin" # via # -r requirements/static/ci/common.in diff --git a/requirements/static/ci/py3.8/lint.txt b/requirements/static/ci/py3.8/lint.txt index fc8c796a744..9d4cbeed123 100644 --- a/requirements/static/ci/py3.8/lint.txt +++ b/requirements/static/ci/py3.8/lint.txt @@ -503,6 +503,8 @@ libnacl==1.8.0 ; sys_platform != "win32" and sys_platform != "darwin" # via -r requirements/static/ci/common.in loguru==0.6.0 # via ciscoconfparse +looseversion==1.0.2 + # via -r requirements/base.txt lxml==4.9.1 # via # junos-eznc @@ -650,7 +652,9 @@ oauthlib==3.2.1 oscrypto==1.2.1 # via certvalidator packaging==21.3 - # via ansible-core + # via + # -r requirements/base.txt + # ansible-core paramiko==2.10.1 ; sys_platform != "win32" and sys_platform != "darwin" # via # -r requirements/static/ci/common.in diff --git a/requirements/static/ci/py3.8/linux.txt b/requirements/static/ci/py3.8/linux.txt index 0b58bae38c8..a6dcc7ef0ea 100644 --- a/requirements/static/ci/py3.8/linux.txt +++ b/requirements/static/ci/py3.8/linux.txt @@ -513,6 +513,8 @@ kubernetes==3.0.0 # via -r requirements/static/ci/common.in libnacl==1.7.1 ; sys_platform != "win32" and sys_platform != "darwin" # via -r requirements/static/ci/common.in +looseversion==1.0.2 + # via -r requirements/base.txt lxml==4.9.1 # via # junos-eznc @@ -654,6 +656,7 @@ oscrypto==1.2.0 # via certvalidator packaging==21.3 # via + # -r requirements/base.txt # ansible-core # pytest paramiko==2.10.1 ; sys_platform != "win32" and sys_platform != "darwin" diff --git a/requirements/static/ci/py3.8/windows.txt b/requirements/static/ci/py3.8/windows.txt index f2b2eee6f15..5ad83a7fa3c 100644 --- a/requirements/static/ci/py3.8/windows.txt +++ b/requirements/static/ci/py3.8/windows.txt @@ -162,6 +162,8 @@ keyring==5.7.1 # via -r requirements/static/ci/common.in kubernetes==3.0.0 # via -r requirements/static/ci/common.in +looseversion==1.0.2 + # via -r requirements/base.txt lxml==4.9.1 # via -r requirements/windows.txt mako==1.2.2 @@ -195,7 +197,9 @@ multidict==6.0.2 ntlm-auth==1.5.0 # via requests-ntlm packaging==21.3 - # via pytest + # via + # -r requirements/base.txt + # pytest passlib[bcrypt]==1.7.4 # via -r requirements/static/ci/common.in patch==1.16 diff --git a/requirements/static/ci/py3.9/cloud.txt b/requirements/static/ci/py3.9/cloud.txt index 0ff22664ba4..5bf84fb8402 100644 --- a/requirements/static/ci/py3.9/cloud.txt +++ b/requirements/static/ci/py3.9/cloud.txt @@ -500,6 +500,8 @@ libnacl==1.8.0 ; sys_platform != "win32" and sys_platform != "darwin" # via -r requirements/static/ci/common.in loguru==0.6.0 # via ciscoconfparse +looseversion==1.0.2 + # via -r requirements/base.txt lxml==4.9.1 # via # junos-eznc @@ -650,7 +652,9 @@ oauthlib==3.2.1 oscrypto==1.2.1 # via certvalidator packaging==21.3 - # via pytest + # via + # -r requirements/base.txt + # pytest paramiko==2.10.1 ; sys_platform != "win32" and sys_platform != "darwin" # via # -r requirements/static/ci/common.in diff --git a/requirements/static/ci/py3.9/darwin.txt b/requirements/static/ci/py3.9/darwin.txt index 128b6a31c6d..76a37502893 100644 --- a/requirements/static/ci/py3.9/darwin.txt +++ b/requirements/static/ci/py3.9/darwin.txt @@ -501,6 +501,8 @@ kubernetes==3.0.0 # via -r requirements/static/ci/common.in linode-python==1.1.1 # via -r requirements/darwin.txt +looseversion==1.0.2 + # via -r requirements/base.txt lxml==4.9.1 # via # junos-eznc @@ -646,7 +648,9 @@ oauthlib==3.2.1 oscrypto==1.2.0 # via certvalidator packaging==21.3 - # via pytest + # via + # -r requirements/base.txt + # pytest paramiko==2.10.1 # via # junos-eznc diff --git a/requirements/static/ci/py3.9/docs.txt b/requirements/static/ci/py3.9/docs.txt index adbb3eeeab5..72c19ff3785 100644 --- a/requirements/static/ci/py3.9/docs.txt +++ b/requirements/static/ci/py3.9/docs.txt @@ -505,6 +505,8 @@ libnacl==1.8.0 ; sys_platform != "win32" and sys_platform != "darwin" # via -r requirements/static/ci/common.in loguru==0.6.0 # via ciscoconfparse +looseversion==1.0.2 + # via -r requirements/base.txt lxml==4.9.1 # via # junos-eznc @@ -649,6 +651,7 @@ oscrypto==1.2.1 # via certvalidator packaging==21.3 # via + # -r requirements/base.txt # ansible-core # sphinx paramiko==2.10.1 ; sys_platform != "win32" and sys_platform != "darwin" diff --git a/requirements/static/ci/py3.9/freebsd.txt b/requirements/static/ci/py3.9/freebsd.txt index 26d34ddf211..3097d61178d 100644 --- a/requirements/static/ci/py3.9/freebsd.txt +++ b/requirements/static/ci/py3.9/freebsd.txt @@ -498,6 +498,8 @@ kubernetes==3.0.0 # via -r requirements/static/ci/common.in libnacl==1.7.1 ; sys_platform != "win32" and sys_platform != "darwin" # via -r requirements/static/ci/common.in +looseversion==1.0.2 + # via -r requirements/base.txt lxml==4.9.1 # via # junos-eznc @@ -641,7 +643,9 @@ oauthlib==3.2.1 oscrypto==1.2.0 # via certvalidator packaging==21.3 - # via pytest + # via + # -r requirements/base.txt + # pytest paramiko==2.10.1 ; sys_platform != "win32" and sys_platform != "darwin" # via # -r requirements/static/ci/common.in diff --git a/requirements/static/ci/py3.9/lint.txt b/requirements/static/ci/py3.9/lint.txt index 9f606b3a591..a93b8913555 100644 --- a/requirements/static/ci/py3.9/lint.txt +++ b/requirements/static/ci/py3.9/lint.txt @@ -501,6 +501,8 @@ libnacl==1.8.0 ; sys_platform != "win32" and sys_platform != "darwin" # via -r requirements/static/ci/common.in loguru==0.6.0 # via ciscoconfparse +looseversion==1.0.2 + # via -r requirements/base.txt lxml==4.9.1 # via # junos-eznc @@ -648,7 +650,9 @@ oauthlib==3.2.1 oscrypto==1.2.1 # via certvalidator packaging==21.3 - # via ansible-core + # via + # -r requirements/base.txt + # ansible-core paramiko==2.10.1 ; sys_platform != "win32" and sys_platform != "darwin" # via # -r requirements/static/ci/common.in diff --git a/requirements/static/ci/py3.9/linux.txt b/requirements/static/ci/py3.9/linux.txt index 57d199301fa..a064d222c9b 100644 --- a/requirements/static/ci/py3.9/linux.txt +++ b/requirements/static/ci/py3.9/linux.txt @@ -515,6 +515,8 @@ kubernetes==3.0.0 # via -r requirements/static/ci/common.in libnacl==1.7.1 ; sys_platform != "win32" and sys_platform != "darwin" # via -r requirements/static/ci/common.in +looseversion==1.0.2 + # via -r requirements/base.txt lxml==4.9.1 # via # junos-eznc @@ -656,6 +658,7 @@ oscrypto==1.2.0 # via certvalidator packaging==21.3 # via + # -r requirements/base.txt # ansible-core # pytest paramiko==2.10.1 ; sys_platform != "win32" and sys_platform != "darwin" diff --git a/requirements/static/ci/py3.9/windows.txt b/requirements/static/ci/py3.9/windows.txt index de350735ac2..a5fd79f8dbc 100644 --- a/requirements/static/ci/py3.9/windows.txt +++ b/requirements/static/ci/py3.9/windows.txt @@ -162,6 +162,8 @@ keyring==5.7.1 # via -r requirements/static/ci/common.in kubernetes==3.0.0 # via -r requirements/static/ci/common.in +looseversion==1.0.2 + # via -r requirements/base.txt lxml==4.9.1 # via -r requirements/windows.txt mako==1.2.2 @@ -195,7 +197,9 @@ multidict==6.0.2 ntlm-auth==1.5.0 # via requests-ntlm packaging==21.3 - # via pytest + # via + # -r requirements/base.txt + # pytest passlib[bcrypt]==1.7.4 # via -r requirements/static/ci/common.in patch==1.16 diff --git a/requirements/static/pkg/py3.10/darwin.txt b/requirements/static/pkg/py3.10/darwin.txt index 2f6036e6506..b5967a113e8 100644 --- a/requirements/static/pkg/py3.10/darwin.txt +++ b/requirements/static/pkg/py3.10/darwin.txt @@ -51,6 +51,8 @@ jmespath==1.0.1 # via -r requirements/base.txt linode-python==1.1.1 # via -r requirements/darwin.txt +looseversion==1.0.2 + # via -r requirements/base.txt mako==1.2.2 # via -r requirements/darwin.txt markupsafe==2.0.1 @@ -66,6 +68,8 @@ more-itertools==8.2.0 # jaraco.functools msgpack==1.0.2 # via -r requirements/base.txt +packaging==22.0 + # via -r requirements/base.txt portend==2.6 # via cherrypy psutil==5.8.0 diff --git a/requirements/static/pkg/py3.10/freebsd.txt b/requirements/static/pkg/py3.10/freebsd.txt index 946d0fb748d..6c2413a86f9 100644 --- a/requirements/static/pkg/py3.10/freebsd.txt +++ b/requirements/static/pkg/py3.10/freebsd.txt @@ -41,6 +41,8 @@ jinja2==3.1.0 # via -r requirements/base.txt jmespath==1.0.1 # via -r requirements/base.txt +looseversion==1.0.2 + # via -r requirements/base.txt markupsafe==2.0.1 # via # -r requirements/base.txt @@ -53,6 +55,8 @@ more-itertools==5.0.0 # jaraco.functools msgpack==1.0.2 # via -r requirements/base.txt +packaging==22.0 + # via -r requirements/base.txt portend==2.4 # via cherrypy psutil==5.8.0 diff --git a/requirements/static/pkg/py3.10/linux.txt b/requirements/static/pkg/py3.10/linux.txt index 882bd8d07f6..cf1c8f61fa5 100644 --- a/requirements/static/pkg/py3.10/linux.txt +++ b/requirements/static/pkg/py3.10/linux.txt @@ -41,6 +41,8 @@ jinja2==3.1.0 # via -r requirements/base.txt jmespath==1.0.1 # via -r requirements/base.txt +looseversion==1.0.2 + # via -r requirements/base.txt markupsafe==2.0.1 # via # -r requirements/base.txt @@ -53,6 +55,8 @@ more-itertools==5.0.0 # jaraco.functools msgpack==1.0.2 # via -r requirements/base.txt +packaging==22.0 + # via -r requirements/base.txt portend==2.4 # via cherrypy psutil==5.8.0 diff --git a/requirements/static/pkg/py3.10/windows.txt b/requirements/static/pkg/py3.10/windows.txt index ef400e8c44b..b52e2677fc0 100644 --- a/requirements/static/pkg/py3.10/windows.txt +++ b/requirements/static/pkg/py3.10/windows.txt @@ -54,6 +54,8 @@ jinja2==3.0.3 # via -r requirements/base.txt jmespath==1.0.1 # via -r requirements/base.txt +looseversion==1.0.2 + # via -r requirements/base.txt lxml==4.9.1 # via -r requirements/windows.txt mako==1.2.2 @@ -71,6 +73,8 @@ more-itertools==8.2.0 # jaraco.functools msgpack==1.0.2 # via -r requirements/base.txt +packaging==22.0 + # via -r requirements/base.txt portend==2.6 # via cherrypy psutil==5.8.0 diff --git a/requirements/static/pkg/py3.6/linux.txt b/requirements/static/pkg/py3.6/linux.txt index 3e46ceac4b1..398bcd88388 100644 --- a/requirements/static/pkg/py3.6/linux.txt +++ b/requirements/static/pkg/py3.6/linux.txt @@ -45,6 +45,8 @@ jinja2==3.0.3 # via -r requirements/base.txt jmespath==0.10.0 # via -r requirements/base.txt +looseversion==1.0.3 + # via -r requirements/base.txt markupsafe==2.0.1 # via # -r requirements/base.txt @@ -57,6 +59,8 @@ more-itertools==5.0.0 # jaraco.functools msgpack==1.0.2 # via -r requirements/base.txt +packaging==21.3 + # via -r requirements/base.txt portend==2.4 # via cherrypy psutil==5.8.0 @@ -67,6 +71,8 @@ pycryptodomex==3.9.8 # via -r requirements/crypto.txt pyopenssl==19.1.0 # via -r requirements/static/pkg/linux.in +pyparsing==3.0.6 + # via packaging python-dateutil==2.8.1 # via -r requirements/static/pkg/linux.in python-gnupg==0.4.8 diff --git a/requirements/static/pkg/py3.7/freebsd.txt b/requirements/static/pkg/py3.7/freebsd.txt index 003a3c58b83..226f43093ab 100644 --- a/requirements/static/pkg/py3.7/freebsd.txt +++ b/requirements/static/pkg/py3.7/freebsd.txt @@ -43,6 +43,8 @@ jinja2==3.1.0 # via -r requirements/base.txt jmespath==1.0.1 # via -r requirements/base.txt +looseversion==1.0.2 + # via -r requirements/base.txt markupsafe==2.0.1 # via # -r requirements/base.txt @@ -55,6 +57,8 @@ more-itertools==5.0.0 # jaraco.functools msgpack==1.0.2 # via -r requirements/base.txt +packaging==22.0 + # via -r requirements/base.txt portend==2.4 # via cherrypy psutil==5.8.0 diff --git a/requirements/static/pkg/py3.7/linux.txt b/requirements/static/pkg/py3.7/linux.txt index a6645d4c9d1..40a61bbc98d 100644 --- a/requirements/static/pkg/py3.7/linux.txt +++ b/requirements/static/pkg/py3.7/linux.txt @@ -41,6 +41,8 @@ jinja2==3.1.0 # via -r requirements/base.txt jmespath==1.0.1 # via -r requirements/base.txt +looseversion==1.0.2 + # via -r requirements/base.txt markupsafe==2.0.1 # via # -r requirements/base.txt @@ -53,6 +55,8 @@ more-itertools==5.0.0 # jaraco.functools msgpack==1.0.2 # via -r requirements/base.txt +packaging==22.0 + # via -r requirements/base.txt portend==2.4 # via cherrypy psutil==5.8.0 diff --git a/requirements/static/pkg/py3.7/windows.txt b/requirements/static/pkg/py3.7/windows.txt index 12fd14be313..61a2324c78b 100644 --- a/requirements/static/pkg/py3.7/windows.txt +++ b/requirements/static/pkg/py3.7/windows.txt @@ -58,6 +58,8 @@ jinja2==3.1.0 # via -r requirements/base.txt jmespath==1.0.1 # via -r requirements/base.txt +looseversion==1.0.2 + # via -r requirements/base.txt lxml==4.9.1 # via -r requirements/windows.txt mako==1.2.2 @@ -75,6 +77,8 @@ more-itertools==8.2.0 # jaraco.functools msgpack==1.0.2 # via -r requirements/base.txt +packaging==22.0 + # via -r requirements/base.txt portend==2.6 # via cherrypy psutil==5.8.0 diff --git a/requirements/static/pkg/py3.8/freebsd.txt b/requirements/static/pkg/py3.8/freebsd.txt index 632da3530b4..a1e1e54948d 100644 --- a/requirements/static/pkg/py3.8/freebsd.txt +++ b/requirements/static/pkg/py3.8/freebsd.txt @@ -43,6 +43,8 @@ jinja2==3.1.0 # via -r requirements/base.txt jmespath==1.0.1 # via -r requirements/base.txt +looseversion==1.0.2 + # via -r requirements/base.txt markupsafe==2.0.1 # via # -r requirements/base.txt @@ -55,6 +57,8 @@ more-itertools==5.0.0 # jaraco.functools msgpack==1.0.2 # via -r requirements/base.txt +packaging==22.0 + # via -r requirements/base.txt portend==2.4 # via cherrypy psutil==5.8.0 diff --git a/requirements/static/pkg/py3.8/linux.txt b/requirements/static/pkg/py3.8/linux.txt index cc82512a6c2..0aca0f62e0a 100644 --- a/requirements/static/pkg/py3.8/linux.txt +++ b/requirements/static/pkg/py3.8/linux.txt @@ -41,6 +41,8 @@ jinja2==3.1.0 # via -r requirements/base.txt jmespath==1.0.1 # via -r requirements/base.txt +looseversion==1.0.2 + # via -r requirements/base.txt markupsafe==2.0.1 # via # -r requirements/base.txt @@ -53,6 +55,8 @@ more-itertools==5.0.0 # jaraco.functools msgpack==1.0.2 # via -r requirements/base.txt +packaging==22.0 + # via -r requirements/base.txt portend==2.4 # via cherrypy psutil==5.8.0 diff --git a/requirements/static/pkg/py3.8/windows.txt b/requirements/static/pkg/py3.8/windows.txt index b0ba7c99243..7d59a472b3d 100644 --- a/requirements/static/pkg/py3.8/windows.txt +++ b/requirements/static/pkg/py3.8/windows.txt @@ -56,6 +56,8 @@ jinja2==3.1.0 # via -r requirements/base.txt jmespath==1.0.1 # via -r requirements/base.txt +looseversion==1.0.2 + # via -r requirements/base.txt lxml==4.9.1 # via -r requirements/windows.txt mako==1.2.2 @@ -73,6 +75,8 @@ more-itertools==8.2.0 # jaraco.functools msgpack==1.0.2 # via -r requirements/base.txt +packaging==22.0 + # via -r requirements/base.txt portend==2.6 # via cherrypy psutil==5.8.0 diff --git a/requirements/static/pkg/py3.9/darwin.txt b/requirements/static/pkg/py3.9/darwin.txt index fb7933893fb..ec64edcfbd8 100644 --- a/requirements/static/pkg/py3.9/darwin.txt +++ b/requirements/static/pkg/py3.9/darwin.txt @@ -53,6 +53,8 @@ jmespath==1.0.1 # via -r requirements/base.txt linode-python==1.1.1 # via -r requirements/darwin.txt +looseversion==1.0.2 + # via -r requirements/base.txt mako==1.2.2 # via -r requirements/darwin.txt markupsafe==2.0.1 @@ -68,6 +70,8 @@ more-itertools==8.2.0 # jaraco.functools msgpack==1.0.2 # via -r requirements/base.txt +packaging==22.0 + # via -r requirements/base.txt portend==2.6 # via cherrypy psutil==5.8.0 diff --git a/requirements/static/pkg/py3.9/freebsd.txt b/requirements/static/pkg/py3.9/freebsd.txt index 73cdf90b28d..b2a4fd179e9 100644 --- a/requirements/static/pkg/py3.9/freebsd.txt +++ b/requirements/static/pkg/py3.9/freebsd.txt @@ -43,6 +43,8 @@ jinja2==3.1.0 # via -r requirements/base.txt jmespath==1.0.1 # via -r requirements/base.txt +looseversion==1.0.2 + # via -r requirements/base.txt markupsafe==2.0.1 # via # -r requirements/base.txt @@ -55,6 +57,8 @@ more-itertools==5.0.0 # jaraco.functools msgpack==1.0.2 # via -r requirements/base.txt +packaging==22.0 + # via -r requirements/base.txt portend==2.4 # via cherrypy psutil==5.8.0 diff --git a/requirements/static/pkg/py3.9/linux.txt b/requirements/static/pkg/py3.9/linux.txt index 6012fdd037b..050c72eeeb3 100644 --- a/requirements/static/pkg/py3.9/linux.txt +++ b/requirements/static/pkg/py3.9/linux.txt @@ -41,6 +41,8 @@ jinja2==3.1.0 # via -r requirements/base.txt jmespath==1.0.1 # via -r requirements/base.txt +looseversion==1.0.2 + # via -r requirements/base.txt markupsafe==2.0.1 # via # -r requirements/base.txt @@ -53,6 +55,8 @@ more-itertools==5.0.0 # jaraco.functools msgpack==1.0.2 # via -r requirements/base.txt +packaging==22.0 + # via -r requirements/base.txt portend==2.4 # via cherrypy psutil==5.8.0 diff --git a/requirements/static/pkg/py3.9/windows.txt b/requirements/static/pkg/py3.9/windows.txt index 6b38ad612f5..9905427845e 100644 --- a/requirements/static/pkg/py3.9/windows.txt +++ b/requirements/static/pkg/py3.9/windows.txt @@ -56,6 +56,8 @@ jinja2==3.1.0 # via -r requirements/base.txt jmespath==1.0.1 # via -r requirements/base.txt +looseversion==1.0.2 + # via -r requirements/base.txt lxml==4.9.1 # via -r requirements/windows.txt mako==1.2.2 @@ -73,6 +75,8 @@ more-itertools==8.2.0 # jaraco.functools msgpack==1.0.2 # via -r requirements/base.txt +packaging==22.0 + # via -r requirements/base.txt portend==2.6 # via cherrypy psutil==5.8.0 diff --git a/salt/cloud/clouds/cloudstack.py b/salt/cloud/clouds/cloudstack.py index e9545d0e127..ef50aaf3bf0 100644 --- a/salt/cloud/clouds/cloudstack.py +++ b/salt/cloud/clouds/cloudstack.py @@ -31,7 +31,7 @@ import salt.utils.event from salt.cloud.libcloudfuncs import * # pylint: disable=redefined-builtin,wildcard-import,unused-wildcard-import from salt.exceptions import SaltCloudSystemExit from salt.utils.functools import namespaced_function -from salt.utils.versions import LooseVersion as _LooseVersion +from salt.utils.versions import Version # CloudStackNetwork will be needed during creation of a new node # pylint: disable=import-error @@ -43,7 +43,7 @@ try: # this work-around. This work-around can be removed when the required # minimum version of libcloud is 2.0.0 (See PR #40837 - which is # implemented in Salt 2018.3.0). - if _LooseVersion(libcloud.__version__) < _LooseVersion("1.4.0"): + if Version(libcloud.__version__) < Version("1.4.0"): # See https://github.com/saltstack/salt/issues/32743 import libcloud.security diff --git a/salt/cloud/clouds/dimensiondata.py b/salt/cloud/clouds/dimensiondata.py index 5973a22316b..a6503def1f4 100644 --- a/salt/cloud/clouds/dimensiondata.py +++ b/salt/cloud/clouds/dimensiondata.py @@ -34,7 +34,7 @@ from salt.exceptions import ( SaltCloudSystemExit, ) from salt.utils.functools import namespaced_function -from salt.utils.versions import LooseVersion as _LooseVersion +from salt.utils.versions import Version # Import libcloud try: @@ -51,7 +51,7 @@ try: # this work-around. This work-around can be removed when the required # minimum version of libcloud is 2.0.0 (See PR #40837 - which is # implemented in Salt 2018.3.0). - if _LooseVersion(libcloud.__version__) < _LooseVersion("1.4.0"): + if Version(libcloud.__version__) < Version("1.4.0"): # See https://github.com/saltstack/salt/issues/32743 import libcloud.security diff --git a/salt/cloud/clouds/gce.py b/salt/cloud/clouds/gce.py index fb18ecb7a49..4c14f4e74d8 100644 --- a/salt/cloud/clouds/gce.py +++ b/salt/cloud/clouds/gce.py @@ -60,7 +60,7 @@ import salt.utils.msgpack from salt.cloud.libcloudfuncs import * # pylint: disable=redefined-builtin,wildcard-import,unused-wildcard-import from salt.exceptions import SaltCloudSystemExit from salt.utils.functools import namespaced_function -from salt.utils.versions import LooseVersion as _LooseVersion +from salt.utils.versions import Version # pylint: disable=import-error LIBCLOUD_IMPORT_ERROR = None @@ -107,7 +107,7 @@ def __virtual__(): if not HAS_LIBCLOUD: return False, "apache-libcloud is not installed" - if _LooseVersion(libcloud.__version__) < _LooseVersion("2.5.0"): + if Version(libcloud.__version__) < Version("2.5.0"): return False, "The salt-cloud GCE driver requires apache-libcloud>=2.5.0" if get_configured_provider() is False: diff --git a/salt/cloud/clouds/openstack.py b/salt/cloud/clouds/openstack.py index cdb588811ee..0a8b8d7e1b2 100644 --- a/salt/cloud/clouds/openstack.py +++ b/salt/cloud/clouds/openstack.py @@ -231,13 +231,13 @@ import pprint import socket import salt.config as config -import salt.utils.versions from salt.exceptions import ( SaltCloudConfigError, SaltCloudExecutionFailure, SaltCloudExecutionTimeout, SaltCloudSystemExit, ) +from salt.utils.versions import Version try: import os_client_config @@ -246,8 +246,7 @@ try: import shade.openstackcloud HAS_SHADE = ( - salt.utils.versions._LooseVersion(shade.__version__) - >= salt.utils.versions._LooseVersion("1.19.0"), + Version(shade.__version__) >= Version("1.19.0"), "Please install newer version of shade: >= 1.19.0", ) except ImportError: diff --git a/salt/cloud/clouds/profitbricks.py b/salt/cloud/clouds/profitbricks.py index 275febd9f2b..72f1b362551 100644 --- a/salt/cloud/clouds/profitbricks.py +++ b/salt/cloud/clouds/profitbricks.py @@ -108,7 +108,7 @@ from salt.exceptions import ( SaltCloudNotFound, SaltCloudSystemExit, ) -from salt.utils.versions import LooseVersion +from salt.utils.versions import Version try: # pylint: disable=no-name-in-module @@ -174,7 +174,7 @@ def version_compatible(version): """ Checks profitbricks version """ - return LooseVersion(profitbricks.API_VERSION) >= LooseVersion(version) + return Version(profitbricks.API_VERSION) >= Version(version) def get_dependencies(): diff --git a/salt/fileserver/azurefs.py b/salt/fileserver/azurefs.py index 1bf8fba236c..cdb1a390d7a 100644 --- a/salt/fileserver/azurefs.py +++ b/salt/fileserver/azurefs.py @@ -58,12 +58,12 @@ import salt.utils.hashutils import salt.utils.json import salt.utils.path import salt.utils.stringutils -from salt.utils.versions import LooseVersion +from salt.utils.versions import Version try: import azure.storage - if LooseVersion(azure.storage.__version__) < LooseVersion("0.20.0"): + if Version(azure.storage.__version__) < Version("0.20.0"): raise ImportError("azure.storage.__version__ must be >= 0.20.0") HAS_AZURE = True except (ImportError, AttributeError): diff --git a/salt/modules/bower.py b/salt/modules/bower.py index 6c53c9bfabc..21f80b2beea 100644 --- a/salt/modules/bower.py +++ b/salt/modules/bower.py @@ -14,7 +14,7 @@ import shlex import salt.utils.json import salt.utils.path from salt.exceptions import CommandExecutionError -from salt.utils.versions import LooseVersion as _LooseVersion +from salt.utils.versions import Version log = logging.getLogger(__name__) @@ -37,10 +37,10 @@ def _check_valid_version(): bower must be at least version 1.3. """ # pylint: disable=no-member - bower_version = _LooseVersion( + bower_version = Version( __salt__["cmd.run"]("{} --version".format(salt.utils.path.which("bower"))) ) - valid_version = _LooseVersion("1.3") + valid_version = Version("1.3") # pylint: enable=no-member if bower_version < valid_version: raise CommandExecutionError( diff --git a/salt/modules/chocolatey.py b/salt/modules/chocolatey.py index 5e5e072efaa..caa7b0bae8f 100644 --- a/salt/modules/chocolatey.py +++ b/salt/modules/chocolatey.py @@ -21,7 +21,7 @@ from salt.exceptions import ( SaltInvocationError, ) from salt.utils.data import CaseInsensitiveDict -from salt.utils.versions import LooseVersion as _LooseVersion +from salt.utils.versions import Version log = logging.getLogger(__name__) @@ -68,7 +68,7 @@ def _yes(): """ if "chocolatey._yes" in __context__: return __context__["chocolatey._yes"] - if _LooseVersion(chocolatey_version()) >= _LooseVersion("0.9.9"): + if Version(chocolatey_version()) >= Version("0.9.9"): answer = ["--yes"] else: answer = [] @@ -83,7 +83,7 @@ def _no_progress(): """ if "chocolatey._no_progress" in __context__: return __context__["chocolatey._no_progress"] - if _LooseVersion(chocolatey_version()) >= _LooseVersion("0.10.4"): + if Version(chocolatey_version()) >= Version("0.10.4"): answer = ["--no-progress"] else: log.warning("--no-progress unsupported in choco < 0.10.4") @@ -778,7 +778,7 @@ def install_missing(name, version=None, source=None): salt '*' chocolatey.install_missing salt '*' chocolatey.install_missing version= """ - if _LooseVersion(chocolatey_version()) >= _LooseVersion("0.9.8.24"): + if Version(chocolatey_version()) >= Version("0.9.8.24"): log.warning("installmissing is deprecated, using install") return install(name, version=version) @@ -1049,7 +1049,7 @@ def update(name, source=None, pre_versions=False): salt "*" chocolatey.update pre_versions=True """ # chocolatey helpfully only supports a single package argument - if _LooseVersion(chocolatey_version()) >= _LooseVersion("0.9.8.24"): + if Version(chocolatey_version()) >= Version("0.9.8.24"): log.warning("update is deprecated, using upgrade") return upgrade(name, source=source, pre_versions=pre_versions) diff --git a/salt/modules/file.py b/salt/modules/file.py index cfd4ebdfafb..69d7992f5ab 100644 --- a/salt/modules/file.py +++ b/salt/modules/file.py @@ -44,10 +44,10 @@ import salt.utils.stringutils import salt.utils.templates import salt.utils.url import salt.utils.user -import salt.utils.versions from salt.exceptions import CommandExecutionError, MinionError, SaltInvocationError from salt.exceptions import get_error_message as _get_error_message from salt.utils.files import HASHES, HASHES_REVMAP +from salt.utils.versions import Version try: import grp @@ -192,8 +192,8 @@ def _chattr_has_extended_attrs(): if ver is None: return False - needed_version = salt.utils.versions.LooseVersion("1.41.12") - chattr_version = salt.utils.versions.LooseVersion(ver) + needed_version = Version("1.41.12") + chattr_version = Version(ver) return chattr_version > needed_version diff --git a/salt/modules/git.py b/salt/modules/git.py index ed74d95c9ca..71b771b6f1b 100644 --- a/salt/modules/git.py +++ b/salt/modules/git.py @@ -20,7 +20,7 @@ import salt.utils.stringutils import salt.utils.templates import salt.utils.url from salt.exceptions import CommandExecutionError, SaltInvocationError -from salt.utils.versions import LooseVersion as _LooseVersion +from salt.utils.versions import LooseVersion log = logging.getLogger(__name__) @@ -42,7 +42,7 @@ def _check_worktree_support(failhard=True): Ensure that we don't try to operate on worktrees in git < 2.5.0. """ git_version = version(versioninfo=False) - if _LooseVersion(git_version) < _LooseVersion("2.5.0"): + if LooseVersion(git_version) < LooseVersion("2.5.0"): if failhard: raise CommandExecutionError( "Worktrees are only supported in git 2.5.0 and newer " @@ -175,7 +175,7 @@ def _format_git_opts(opts): """ if opts: version_ = version(versioninfo=False) - if _LooseVersion(version_) < _LooseVersion("1.7.2"): + if LooseVersion(version_) < LooseVersion("1.7.2"): raise SaltInvocationError( "git_opts is only supported for git versions >= 1.7.2 " "(detected: {})".format(version_) @@ -450,8 +450,8 @@ def _which_git_config(global_, cwd, user, password, output_encoding=None): """ if global_: return ["--global"] - version_ = _LooseVersion(version(versioninfo=False)) - if version_ >= _LooseVersion("1.7.10.2"): + version_ = LooseVersion(version(versioninfo=False)) + if version_ >= LooseVersion("1.7.10.2"): # --local added in 1.7.10.2 return ["--local"] else: @@ -1825,7 +1825,7 @@ def describe( """ cwd = _expand_path(cwd, user) command = ["git", "describe"] - if _LooseVersion(version(versioninfo=False)) >= _LooseVersion("1.5.6"): + if LooseVersion(version(versioninfo=False)) >= LooseVersion("1.5.6"): command.append("--always") command.append(rev) return _git_run( @@ -1970,7 +1970,7 @@ def diff( failhard = True if no_index: - if _LooseVersion(version(versioninfo=False)) < _LooseVersion("1.5.1"): + if LooseVersion(version(versioninfo=False)) < LooseVersion("1.5.1"): raise CommandExecutionError( "The 'no_index' option is only supported in Git 1.5.1 and newer" ) @@ -2701,8 +2701,8 @@ def list_worktrees( tracked_data_points = ("worktree", "HEAD", "branch") ret = {} - git_version = _LooseVersion(version(versioninfo=False)) - has_native_list_subcommand = git_version >= _LooseVersion("2.7.0") + git_version = LooseVersion(version(versioninfo=False)) + has_native_list_subcommand = git_version >= LooseVersion("2.7.0") if has_native_list_subcommand: out = _git_run( ["git", "worktree", "list", "--porcelain"], @@ -3356,7 +3356,7 @@ def merge_base( refs = ["HEAD"] if is_ancestor: - if _LooseVersion(version(versioninfo=False)) < _LooseVersion("1.8.0"): + if LooseVersion(version(versioninfo=False)) < LooseVersion("1.8.0"): # Pre 1.8.0 git doesn't have --is-ancestor, so the logic here is a # little different. First we need to resolve the first ref to a # full SHA1, and then if running git merge-base on both commits @@ -5229,8 +5229,7 @@ def version(versioninfo=False): Returns the version of Git installed on the minion versioninfo : False - If ``True``, return the version in a versioninfo list (e.g. ``[2, 5, - 0]``) + If ``True``, return the version in a versioninfo list (e.g. ``[2, 5, 0]``) CLI Example: @@ -5249,9 +5248,15 @@ def version(versioninfo=False): try: # On macOS, the git version is displayed in a different format # git version 2.21.1 (Apple Git-122.3) + # On Windows: + # git version 2.21.1.windows.1 # As opposed to: # git version 2.21.1 - __context__[contextkey] = version_.split("(")[0].strip().split()[-1] + if "(" in version_: + version_ = version_.split("(")[0].strip() + if ".windows" in version_: + version_ = version_.split(".windows")[0].strip() + __context__[contextkey] = version_.strip().split()[-1].strip() except IndexError: # Somehow git --version returned no stdout while not raising an # error. Should never happen but we should still account for this @@ -5540,7 +5545,7 @@ def worktree_prune( output_encoding=output_encoding, ) git_version = version(versioninfo=False) - if _LooseVersion(git_version) > _LooseVersion("2.35.0"): + if LooseVersion(git_version) > LooseVersion("2.35.0"): return result["stderr"] return result["stdout"] diff --git a/salt/modules/kernelpkg_linux_apt.py b/salt/modules/kernelpkg_linux_apt.py index 36515227207..fc8684d03fa 100644 --- a/salt/modules/kernelpkg_linux_apt.py +++ b/salt/modules/kernelpkg_linux_apt.py @@ -6,13 +6,8 @@ import functools import logging import re -try: - from salt.exceptions import CommandExecutionError - from salt.utils.versions import LooseVersion as _LooseVersion - - HAS_REQUIRED_LIBS = True -except ImportError: - HAS_REQUIRED_LIBS = False +from salt.exceptions import CommandExecutionError +from salt.utils.versions import LooseVersion log = logging.getLogger(__name__) @@ -24,10 +19,6 @@ def __virtual__(): """ Load this module on Debian-based systems only """ - - if not HAS_REQUIRED_LIBS: - return (False, "Required library could not be imported") - if __grains__.get("os_family", "") in ("Kali", "Debian"): return __virtualname__ elif __grains__.get("os_family", "") == "Cumulus": @@ -133,7 +124,7 @@ def needs_reboot(): salt '*' kernelpkg.needs_reboot """ - return _LooseVersion(active()) < _LooseVersion(latest_installed()) + return LooseVersion(active()) < LooseVersion(latest_installed()) def upgrade(reboot=False, at_time=None): @@ -192,7 +183,7 @@ def upgrade_available(): salt '*' kernelpkg.upgrade_available """ - return _LooseVersion(latest_available()) > _LooseVersion(latest_installed()) + return LooseVersion(latest_available()) > LooseVersion(latest_installed()) def remove(release): @@ -278,8 +269,8 @@ def _cmp_version(item1, item2): """ Compare function for package version sorting """ - vers1 = _LooseVersion(item1) - vers2 = _LooseVersion(item2) + vers1 = LooseVersion(item1) + vers2 = LooseVersion(item2) if vers1 < vers2: return -1 diff --git a/salt/modules/kernelpkg_linux_yum.py b/salt/modules/kernelpkg_linux_yum.py index 83294614c9d..a144a98811d 100644 --- a/salt/modules/kernelpkg_linux_yum.py +++ b/salt/modules/kernelpkg_linux_yum.py @@ -5,37 +5,27 @@ Manage Linux kernel packages on YUM-based systems import functools import logging -try: - import salt.modules.yumpkg - import salt.utils.data - import salt.utils.functools - import salt.utils.systemd - from salt.exceptions import CommandExecutionError - from salt.utils.versions import LooseVersion as _LooseVersion - - __IMPORT_ERROR = None -except ImportError as exc: - __IMPORT_ERROR = exc.__str__() +import salt.modules.yumpkg +import salt.utils.data +import salt.utils.functools +import salt.utils.systemd +from salt.exceptions import CommandExecutionError +from salt.utils.versions import LooseVersion log = logging.getLogger(__name__) __virtualname__ = "kernelpkg" -if __IMPORT_ERROR is None: - # Import functions from yumpkg - # pylint: disable=invalid-name, protected-access - _yum = salt.utils.functools.namespaced_function(salt.modules.yumpkg._yum, globals()) - # pylint: enable=invalid-name, protected-access +# Import functions from yumpkg +# pylint: disable=invalid-name, protected-access +_yum = salt.utils.functools.namespaced_function(salt.modules.yumpkg._yum, globals()) +# pylint: enable=invalid-name, protected-access def __virtual__(): """ Load this module on RedHat-based systems only """ - - if __IMPORT_ERROR: - return False, __IMPORT_ERROR - if __grains__.get("os_family", "") == "RedHat": return __virtualname__ elif __grains__.get("os", "").lower() in ( @@ -133,7 +123,7 @@ def needs_reboot(): salt '*' kernelpkg.needs_reboot """ - return _LooseVersion(active()) < _LooseVersion(latest_installed()) + return LooseVersion(active()) < LooseVersion(latest_installed()) def upgrade(reboot=False, at_time=None): @@ -190,7 +180,7 @@ def upgrade_available(): salt '*' kernelpkg.upgrade_available """ - return _LooseVersion(latest_available()) > _LooseVersion(latest_installed()) + return LooseVersion(latest_available()) > LooseVersion(latest_installed()) def remove(release): @@ -291,8 +281,8 @@ def _cmp_version(item1, item2): """ Compare function for package version sorting """ - vers1 = _LooseVersion(item1) - vers2 = _LooseVersion(item2) + vers1 = LooseVersion(item1) + vers2 = LooseVersion(item2) if vers1 < vers2: return -1 diff --git a/salt/modules/launchctl_service.py b/salt/modules/launchctl_service.py index f049b692ec7..b30ce1320f4 100644 --- a/salt/modules/launchctl_service.py +++ b/salt/modules/launchctl_service.py @@ -23,7 +23,7 @@ import salt.utils.files import salt.utils.path import salt.utils.platform import salt.utils.stringutils -from salt.utils.versions import LooseVersion as _LooseVersion +from salt.utils.versions import Version # Set up logging log = logging.getLogger(__name__) @@ -51,14 +51,14 @@ def __virtual__(): 'Required binary not found: "/bin/launchctl"', ) - if _LooseVersion(__grains__["osrelease"]) >= _LooseVersion("10.11"): + if Version(__grains__["osrelease"]) >= Version("10.11"): return ( False, "Failed to load the mac_service module:\n" "Not available on El Capitan, uses mac_service.py", ) - if _LooseVersion(__grains__["osrelease"]) >= _LooseVersion("10.10"): + if Version(__grains__["osrelease"]) >= Version("10.10"): global BEFORE_YOSEMITE BEFORE_YOSEMITE = False diff --git a/salt/modules/libcloud_compute.py b/salt/modules/libcloud_compute.py index fe1a2aed8b5..73171caa553 100644 --- a/salt/modules/libcloud_compute.py +++ b/salt/modules/libcloud_compute.py @@ -35,7 +35,7 @@ import os.path import salt.utils.args import salt.utils.compat -from salt.utils.versions import LooseVersion as _LooseVersion +from salt.utils.versions import Version log = logging.getLogger(__name__) @@ -47,9 +47,9 @@ try: from libcloud.compute.providers import get_driver # pylint: enable=unused-import - if hasattr(libcloud, "__version__") and _LooseVersion( - libcloud.__version__ - ) < _LooseVersion(REQUIRED_LIBCLOUD_VERSION): + if hasattr(libcloud, "__version__") and Version(libcloud.__version__) < Version( + REQUIRED_LIBCLOUD_VERSION + ): raise ImportError() logging.getLogger("libcloud").setLevel(logging.CRITICAL) HAS_LIBCLOUD = True diff --git a/salt/modules/libcloud_dns.py b/salt/modules/libcloud_dns.py index dab3b775db5..182b7fb7820 100644 --- a/salt/modules/libcloud_dns.py +++ b/salt/modules/libcloud_dns.py @@ -30,7 +30,7 @@ Connection module for Apache Libcloud DNS management import logging -from salt.utils.versions import LooseVersion as _LooseVersion +from salt.utils.versions import Version log = logging.getLogger(__name__) @@ -42,9 +42,9 @@ try: from libcloud.dns.types import RecordType # pylint: enable=unused-import - if hasattr(libcloud, "__version__") and _LooseVersion( - libcloud.__version__ - ) < _LooseVersion(REQUIRED_LIBCLOUD_VERSION): + if hasattr(libcloud, "__version__") and Version(libcloud.__version__) < Version( + REQUIRED_LIBCLOUD_VERSION + ): raise ImportError() logging.getLogger("libcloud").setLevel(logging.CRITICAL) HAS_LIBCLOUD = True diff --git a/salt/modules/libcloud_loadbalancer.py b/salt/modules/libcloud_loadbalancer.py index e524cdf8f23..08d768ef626 100644 --- a/salt/modules/libcloud_loadbalancer.py +++ b/salt/modules/libcloud_loadbalancer.py @@ -34,7 +34,7 @@ import logging import salt.utils.args import salt.utils.compat -from salt.utils.versions import LooseVersion as _LooseVersion +from salt.utils.versions import Version log = logging.getLogger(__name__) @@ -46,9 +46,9 @@ try: from libcloud.loadbalancer.providers import get_driver # pylint: enable=unused-import - if hasattr(libcloud, "__version__") and _LooseVersion( - libcloud.__version__ - ) < _LooseVersion(REQUIRED_LIBCLOUD_VERSION): + if hasattr(libcloud, "__version__") and Version(libcloud.__version__) < Version( + REQUIRED_LIBCLOUD_VERSION + ): raise ImportError() logging.getLogger("libcloud").setLevel(logging.CRITICAL) HAS_LIBCLOUD = True diff --git a/salt/modules/libcloud_storage.py b/salt/modules/libcloud_storage.py index 9b601686f3b..7e055ab30e5 100644 --- a/salt/modules/libcloud_storage.py +++ b/salt/modules/libcloud_storage.py @@ -34,7 +34,7 @@ import logging import salt.utils.args import salt.utils.compat -from salt.utils.versions import LooseVersion as _LooseVersion +from salt.utils.versions import Version log = logging.getLogger(__name__) @@ -45,9 +45,9 @@ try: from libcloud.storage.providers import get_driver # pylint: enable=unused-import - if hasattr(libcloud, "__version__") and _LooseVersion( - libcloud.__version__ - ) < _LooseVersion(REQUIRED_LIBCLOUD_VERSION): + if hasattr(libcloud, "__version__") and Version(libcloud.__version__) < Version( + REQUIRED_LIBCLOUD_VERSION + ): raise ImportError() logging.getLogger("libcloud").setLevel(logging.CRITICAL) HAS_LIBCLOUD = True diff --git a/salt/modules/lxc.py b/salt/modules/lxc.py index d773129e225..bea6445db98 100644 --- a/salt/modules/lxc.py +++ b/salt/modules/lxc.py @@ -35,7 +35,7 @@ import salt.utils.odict import salt.utils.path import salt.utils.stringutils from salt.exceptions import CommandExecutionError, SaltInvocationError -from salt.utils.versions import LooseVersion as _LooseVersion +from salt.utils.versions import Version # Set up logging log = logging.getLogger(__name__) @@ -116,8 +116,8 @@ def version(): if not __context__.get(k, None): cversion = __salt__["cmd.run_all"]("lxc-info --version") if not cversion["retcode"]: - ver = _LooseVersion(cversion["stdout"]) - if ver < _LooseVersion("1.0"): + ver = Version(cversion["stdout"]) + if ver < Version("1.0"): raise CommandExecutionError("LXC should be at least 1.0") __context__[k] = "{}".format(ver) return __context__.get(k, None) @@ -878,7 +878,7 @@ def _network_conf(conf_tuples=None, **kwargs): # if we didn't explicitly say no to # (lxc.network.ipv4.gateway: auto) if ( - _LooseVersion(version()) <= _LooseVersion("1.0.7") + Version(version()) <= Version("1.0.7") and True not in ["lxc.network.ipv4.gateway" in a for a in ret] and True in ["lxc.network.ipv4" in a for a in ret] ): @@ -2129,7 +2129,7 @@ def clone(name, orig, profile=None, network_profile=None, nic_opts=None, **kwarg if backing in ("dir", "overlayfs", "btrfs"): size = None # LXC commands and options changed in 2.0 - CF issue #34086 for details - if _LooseVersion(version()) >= _LooseVersion("2.0"): + if Version(version()) >= Version("2.0"): # https://linuxcontainers.org/lxc/manpages//man1/lxc-copy.1.html cmd = "lxc-copy" cmd += " {} -n {} -N {}".format(snapshot, orig, name) diff --git a/salt/modules/lxd.py b/salt/modules/lxd.py index c855234a893..cc91c1b59b7 100644 --- a/salt/modules/lxd.py +++ b/salt/modules/lxd.py @@ -39,7 +39,7 @@ from datetime import datetime import salt.utils.decorators.path import salt.utils.files from salt.exceptions import CommandExecutionError, SaltInvocationError -from salt.utils.versions import LooseVersion +from salt.utils.versions import Version try: import pylxd @@ -82,7 +82,7 @@ _connection_pool = {} def __virtual__(): if HAS_PYLXD: - if LooseVersion(pylxd_version()) < LooseVersion(_pylxd_minimal_version): + if Version(pylxd_version()) < Version(_pylxd_minimal_version): return ( False, 'The lxd execution module cannot be loaded: pylxd "{}" is ' diff --git a/salt/modules/mac_assistive.py b/salt/modules/mac_assistive.py index 0ecdda21a83..8583c40efba 100644 --- a/salt/modules/mac_assistive.py +++ b/salt/modules/mac_assistive.py @@ -15,7 +15,7 @@ import sqlite3 import salt.utils.platform import salt.utils.stringutils from salt.exceptions import CommandExecutionError -from salt.utils.versions import LooseVersion as _LooseVersion +from salt.utils.versions import Version log = logging.getLogger(__name__) @@ -31,7 +31,7 @@ def __virtual__(): """ if not salt.utils.platform.is_darwin(): return False, "Must be run on macOS" - if _LooseVersion(__grains__["osrelease"]) < salt.utils.stringutils.to_str("10.9"): + if Version(__grains__["osrelease"]) < Version("10.9"): return False, "Must be run on macOS 10.9 or newer" return __virtualname__ diff --git a/salt/modules/mac_service.py b/salt/modules/mac_service.py index 900c937e63b..2932d083651 100644 --- a/salt/modules/mac_service.py +++ b/salt/modules/mac_service.py @@ -36,7 +36,7 @@ import salt.utils.path import salt.utils.platform import salt.utils.stringutils from salt.exceptions import CommandExecutionError -from salt.utils.versions import LooseVersion as _LooseVersion +from salt.utils.versions import Version # Define the module's virtual name __virtualname__ = "service" @@ -79,7 +79,7 @@ def __virtual__(): 'Required binary not found: "plutil"', ) - if _LooseVersion(__grains__["osrelease"]) < _LooseVersion("10.11"): + if Version(__grains__["osrelease"]) < Version("10.11"): return ( False, "Failed to load the mac_service module:\nRequires macOS 10.11 or newer", diff --git a/salt/modules/mongodb.py b/salt/modules/mongodb.py index 69785ed04d9..72b0ff00747 100644 --- a/salt/modules/mongodb.py +++ b/salt/modules/mongodb.py @@ -18,7 +18,7 @@ import re import salt.utils.json from salt.exceptions import get_error_message as _get_error_message -from salt.utils.versions import LooseVersion as _LooseVersion +from salt.utils.versions import Version try: import pymongo @@ -336,7 +336,7 @@ def user_list( output = [] mongodb_version = _version(mdb) - if _LooseVersion(mongodb_version) >= _LooseVersion("2.6"): + if Version(mongodb_version) >= Version("2.6"): for user in mdb.command("usersInfo")["users"]: output.append({"user": user["user"], "roles": user["roles"]}) else: diff --git a/salt/modules/npm.py b/salt/modules/npm.py index 6b0052e9c7d..edbb7b4ae1d 100644 --- a/salt/modules/npm.py +++ b/salt/modules/npm.py @@ -11,7 +11,7 @@ import salt.utils.json import salt.utils.path import salt.utils.user from salt.exceptions import CommandExecutionError -from salt.utils.versions import LooseVersion as _LooseVersion +from salt.utils.versions import Version log = logging.getLogger(__name__) @@ -50,7 +50,8 @@ def _check_valid_version(): res = salt.modules.cmdmod.run( "{npm} --version".format(npm=npm_path), output_loglevel="quiet" ) - npm_version, valid_version = _LooseVersion(res), _LooseVersion("1.2") + npm_version = Version(res) + valid_version = Version("1.2") # pylint: enable=no-member if npm_version < valid_version: raise CommandExecutionError( diff --git a/salt/modules/opkg.py b/salt/modules/opkg.py index c2144625f3c..98882c85e96 100644 --- a/salt/modules/opkg.py +++ b/salt/modules/opkg.py @@ -33,6 +33,7 @@ import salt.utils.pkg import salt.utils.stringutils import salt.utils.versions from salt.exceptions import CommandExecutionError, MinionError, SaltInvocationError +from salt.utils.versions import Version REPO_REGEXP = r'^#?\s*(src|src/gz)\s+([^\s<>]+|"[^<>]+")\s+[^\s<>]+' OPKG_CONFDIR = "/etc/opkg" @@ -1229,9 +1230,7 @@ def version_cmp( ["opkg", "--version"], output_loglevel="trace", python_shell=False ) opkg_version = output.split(" ")[2].strip() - if salt.utils.versions.LooseVersion( - opkg_version - ) >= salt.utils.versions.LooseVersion("0.3.4"): + if Version(opkg_version) >= Version("0.3.4"): cmd_compare = ["opkg", "compare-versions"] elif salt.utils.path.which("opkg-compare-versions"): cmd_compare = ["opkg-compare-versions"] diff --git a/salt/modules/pacmanpkg.py b/salt/modules/pacmanpkg.py index 2b82d9d66ae..88336f6957a 100644 --- a/salt/modules/pacmanpkg.py +++ b/salt/modules/pacmanpkg.py @@ -20,7 +20,7 @@ import salt.utils.itertools import salt.utils.pkg import salt.utils.systemd from salt.exceptions import CommandExecutionError, MinionError -from salt.utils.versions import LooseVersion as _LooseVersion +from salt.utils.versions import LooseVersion log = logging.getLogger(__name__) @@ -1036,7 +1036,7 @@ def list_repo_pkgs(*args, **kwargs): # Sort versions newest to oldest for pkgname in ret[reponame]: sorted_versions = sorted( - (_LooseVersion(x) for x in ret[reponame][pkgname]), reverse=True + (LooseVersion(x) for x in ret[reponame][pkgname]), reverse=True ) ret[reponame][pkgname] = [x.vstring for x in sorted_versions] return ret @@ -1047,7 +1047,7 @@ def list_repo_pkgs(*args, **kwargs): byrepo_ret.setdefault(pkgname, []).extend(ret[reponame][pkgname]) for pkgname in byrepo_ret: sorted_versions = sorted( - (_LooseVersion(x) for x in byrepo_ret[pkgname]), reverse=True + (LooseVersion(x) for x in byrepo_ret[pkgname]), reverse=True ) byrepo_ret[pkgname] = [x.vstring for x in sorted_versions] return byrepo_ret diff --git a/salt/modules/pip.py b/salt/modules/pip.py index 92f43b04e2b..5e3d1ffe7b1 100644 --- a/salt/modules/pip.py +++ b/salt/modules/pip.py @@ -154,10 +154,8 @@ def _get_pip_bin(bin_env): Locate the pip binary, either from `bin_env` as a virtualenv, as the executable itself, or from searching conventional filesystem locations """ - bundled = _check_bundled() - if not bin_env: - if bundled: + if _check_bundled(): logger.debug("pip: Using pip from bundled app") return [os.path.normpath(sys.executable), "pip"] else: diff --git a/salt/modules/postgres.py b/salt/modules/postgres.py index 0e29640ad95..25a72f1063c 100644 --- a/salt/modules/postgres.py +++ b/salt/modules/postgres.py @@ -57,7 +57,7 @@ import salt.utils.path import salt.utils.stringutils from salt.exceptions import CommandExecutionError, SaltInvocationError from salt.ext.saslprep import saslprep -from salt.utils.versions import LooseVersion as _LooseVersion +from salt.utils.versions import LooseVersion try: import csv @@ -336,7 +336,7 @@ def _parsed_version( ) if psql_version: - return _LooseVersion(psql_version) + return LooseVersion(psql_version) else: log.warning( "Attempt to parse version of Postgres server failed. " @@ -998,11 +998,11 @@ def user_list( runas=runas, ) if ver: - if ver >= _LooseVersion("9.1"): + if ver >= LooseVersion("9.1"): replication_column = "pg_roles.rolreplication" else: replication_column = "NULL" - if ver >= _LooseVersion("9.5"): + if ver >= LooseVersion("9.5"): rolcatupdate_column = "NULL" else: rolcatupdate_column = "pg_roles.rolcatupdate" @@ -1790,11 +1790,11 @@ def is_available_extension( def _pg_is_older_ext_ver(a, b): """ - Compare versions of extensions using salt.utils.versions.LooseVersion. + Compare versions of extensions using `looseversion.LooseVersion`. Returns ``True`` if version a is lesser than b. """ - return _LooseVersion(a) < _LooseVersion(b) + return LooseVersion(a) < LooseVersion(b) def is_installed_extension( diff --git a/salt/modules/rabbitmq.py b/salt/modules/rabbitmq.py index 46002afd700..e0a9304bd54 100644 --- a/salt/modules/rabbitmq.py +++ b/salt/modules/rabbitmq.py @@ -16,7 +16,7 @@ import salt.utils.path import salt.utils.platform import salt.utils.user from salt.exceptions import CommandExecutionError, SaltInvocationError -from salt.utils.versions import LooseVersion as _LooseVersion +from salt.utils.versions import Version log = logging.getLogger(__name__) @@ -973,7 +973,7 @@ def list_policies(vhost="/", runas=None): ret[vhost] = {} ret[vhost][name] = {} - if _LooseVersion(version) >= _LooseVersion("3.7"): + if Version(version) >= Version("3.7"): # in version 3.7 the position of apply_to and pattern has been # switched ret[vhost][name]["pattern"] = parts[2] diff --git a/salt/modules/tls.py b/salt/modules/tls.py index 122a9118d68..b74b765cfbb 100644 --- a/salt/modules/tls.py +++ b/salt/modules/tls.py @@ -111,7 +111,7 @@ import salt.utils.data import salt.utils.files import salt.utils.stringutils from salt.exceptions import CommandExecutionError -from salt.utils.versions import LooseVersion as _LooseVersion +from salt.utils.versions import Version # pylint: disable=C0103 @@ -122,7 +122,7 @@ try: import OpenSSL HAS_SSL = True - OpenSSL_version = _LooseVersion(OpenSSL.__dict__.get("__version__", "0.0")) + OpenSSL_version = Version(OpenSSL.__dict__.get("__version__", "0.0")) except ImportError: pass @@ -138,14 +138,14 @@ def __virtual__(): Only load this module if the ca config options are set """ global X509_EXT_ENABLED - if HAS_SSL and OpenSSL_version >= _LooseVersion("0.10"): - if OpenSSL_version < _LooseVersion("0.14"): + if HAS_SSL and OpenSSL_version >= Version("0.10"): + if OpenSSL_version < Version("0.14"): X509_EXT_ENABLED = False log.debug( "You should upgrade pyOpenSSL to at least 0.14.1 to " "enable the use of X509 extensions in the tls module" ) - elif OpenSSL_version <= _LooseVersion("0.15"): + elif OpenSSL_version <= Version("0.15"): log.debug( "You should upgrade pyOpenSSL to at least 0.15.1 to " "enable the full use of X509 extensions in the tls module" diff --git a/salt/modules/travisci.py b/salt/modules/travisci.py index b746d3b028a..70672403b5b 100644 --- a/salt/modules/travisci.py +++ b/salt/modules/travisci.py @@ -7,7 +7,7 @@ import base64 import urllib.parse import salt.utils.json -from salt.utils.versions import LooseVersion as _LooseVersion +from salt.utils.versions import Version try: import OpenSSL @@ -30,8 +30,8 @@ def __virtual__(): OPENSSL_MIN_VER ), ) - cur_version = _LooseVersion(OpenSSL.__version__) - min_version = _LooseVersion(OPENSSL_MIN_VER) + cur_version = Version(OpenSSL.__version__) + min_version = Version(OPENSSL_MIN_VER) if cur_version < min_version: return ( False, diff --git a/salt/modules/win_pkg.py b/salt/modules/win_pkg.py index 51441b34668..46202fcad3d 100644 --- a/salt/modules/win_pkg.py +++ b/salt/modules/win_pkg.py @@ -65,7 +65,7 @@ from salt.exceptions import ( SaltInvocationError, SaltRenderError, ) -from salt.utils.versions import LooseVersion +from salt.utils.versions import Version log = logging.getLogger(__name__) @@ -2356,7 +2356,7 @@ def _reverse_cmp_pkg_versions(pkg1, pkg2): """ Compare software package versions """ - return 1 if LooseVersion(pkg1) > LooseVersion(pkg2) else -1 + return 1 if Version(pkg1) > Version(pkg2) else -1 def _get_latest_pkg_version(pkginfo): diff --git a/salt/modules/yumpkg.py b/salt/modules/yumpkg.py index fc33f6192f6..4d0070f21a8 100644 --- a/salt/modules/yumpkg.py +++ b/salt/modules/yumpkg.py @@ -41,7 +41,7 @@ import salt.utils.pkg.rpm import salt.utils.systemd import salt.utils.versions from salt.exceptions import CommandExecutionError, MinionError, SaltInvocationError -from salt.utils.versions import LooseVersion as _LooseVersion +from salt.utils.versions import LooseVersion try: import yum @@ -559,7 +559,7 @@ def latest_version(*names, **kwargs): # Sort by version number (highest to lowest) for loop below updates = sorted( _yum_pkginfo(out["stdout"]), - key=lambda pkginfo: _LooseVersion(pkginfo.version), + key=lambda pkginfo: LooseVersion(pkginfo.version), reverse=True, ) @@ -963,14 +963,14 @@ def list_repo_pkgs(*args, **kwargs): yum_version = ( None if _yum() != "yum" - else _LooseVersion( + else LooseVersion( __salt__["cmd.run"](["yum", "--version"], python_shell=False) .splitlines()[0] .strip() ) ) # Really old version of yum; does not even have --showduplicates option - if yum_version and yum_version < _LooseVersion("3.2.13"): + if yum_version and yum_version < LooseVersion("3.2.13"): cmd_prefix = ["--quiet"] if cacheonly: cmd_prefix.append("-C") @@ -982,7 +982,7 @@ def list_repo_pkgs(*args, **kwargs): _parse_output(out["stdout"], strict=True) # The --showduplicates option is added in 3.2.13, but the # repository-packages subcommand is only in 3.4.3 and newer - elif yum_version and yum_version < _LooseVersion("3.4.3"): + elif yum_version and yum_version < LooseVersion("3.4.3"): cmd_prefix = ["--quiet", "--showduplicates"] if cacheonly: cmd_prefix.append("-C") @@ -1018,7 +1018,7 @@ def list_repo_pkgs(*args, **kwargs): # Sort versions newest to oldest for pkgname in ret[reponame]: sorted_versions = sorted( - (_LooseVersion(x) for x in ret[reponame][pkgname]), reverse=True + (LooseVersion(x) for x in ret[reponame][pkgname]), reverse=True ) ret[reponame][pkgname] = [x.vstring for x in sorted_versions] return ret @@ -1029,7 +1029,7 @@ def list_repo_pkgs(*args, **kwargs): byrepo_ret.setdefault(pkgname, []).extend(ret[reponame][pkgname]) for pkgname in byrepo_ret: sorted_versions = sorted( - (_LooseVersion(x) for x in byrepo_ret[pkgname]), reverse=True + (LooseVersion(x) for x in byrepo_ret[pkgname]), reverse=True ) byrepo_ret[pkgname] = [x.vstring for x in sorted_versions] return byrepo_ret diff --git a/salt/modules/zabbix.py b/salt/modules/zabbix.py index 88d5e594aa0..d6fdeacc929 100644 --- a/salt/modules/zabbix.py +++ b/salt/modules/zabbix.py @@ -33,7 +33,7 @@ import salt.utils.files import salt.utils.http import salt.utils.json from salt.exceptions import SaltException -from salt.utils.versions import LooseVersion as _LooseVersion +from salt.utils.versions import Version log = logging.getLogger(__name__) @@ -572,7 +572,7 @@ def user_create(alias, passwd, usrgrps, **connection_args): username_field = "alias" # Zabbix 5.4 changed object fields - if _LooseVersion(zabbix_version) > _LooseVersion("5.2"): + if Version(zabbix_version) > Version("5.2"): username_field = "username" try: @@ -655,7 +655,7 @@ def user_exists(alias, **connection_args): username_field = "alias" # Zabbix 5.4 changed object fields - if _LooseVersion(zabbix_version) > _LooseVersion("5.2"): + if Version(zabbix_version) > Version("5.2"): username_field = "username" try: @@ -697,7 +697,7 @@ def user_get(alias=None, userids=None, **connection_args): username_field = "alias" # Zabbix 5.4 changed object fields - if _LooseVersion(zabbix_version) > _LooseVersion("5.2"): + if Version(zabbix_version) > Version("5.2"): username_field = "username" try: @@ -772,19 +772,13 @@ def user_update(userid, **connection_args): "userid": userid, } - if ( - _LooseVersion(zabbix_version) < _LooseVersion("3.4") - and medias is not None - ): + if Version(zabbix_version) < Version("3.4") and medias is not None: ret = { "result": False, "comment": "Setting medias available in Zabbix 3.4+", } return ret - elif ( - _LooseVersion(zabbix_version) > _LooseVersion("5.0") - and medias is not None - ): + elif Version(zabbix_version) > Version("5.0") and medias is not None: params["medias"] = medias elif medias is not None: params["user_medias"] = medias @@ -833,7 +827,7 @@ def user_getmedia(userids=None, **connection_args): zabbix_version = apiinfo_version(**connection_args) ret = False - if _LooseVersion(zabbix_version) > _LooseVersion("3.4"): + if Version(zabbix_version) > Version("3.4"): users = user_get(userids=userids, **connection_args) medias = [] for user in users: @@ -889,7 +883,7 @@ def user_addmedia( method = "user.addmedia" - if _LooseVersion(zabbix_version) > _LooseVersion("3.4"): + if Version(zabbix_version) > Version("3.4"): ret = { "result": False, "comment": "Method '{}' removed in Zabbix 4.0+ use 'user.update'".format( @@ -951,7 +945,7 @@ def user_deletemedia(mediaids, **connection_args): method = "user.deletemedia" - if _LooseVersion(zabbix_version) > _LooseVersion("3.4"): + if Version(zabbix_version) > Version("3.4"): ret = { "result": False, "comment": "Method '{}' removed in Zabbix 4.0+ use 'user.update'".format( @@ -1107,7 +1101,7 @@ def usergroup_exists(name=None, node=None, nodeids=None, **connection_args): try: if conn_args: # usergroup.exists deprecated - if _LooseVersion(zabbix_version) > _LooseVersion("2.5"): + if Version(zabbix_version) > Version("2.5"): if not name: name = "" ret = usergroup_get(name, None, **connection_args) @@ -1127,7 +1121,7 @@ def usergroup_exists(name=None, node=None, nodeids=None, **connection_args): if name: params["name"] = name # deprecated in 2.4 - if _LooseVersion(zabbix_version) < _LooseVersion("2.4"): + if Version(zabbix_version) < Version("2.4"): if node: params["node"] = node if nodeids: @@ -1174,7 +1168,7 @@ def usergroup_get(name=None, usrgrpids=None, userids=None, **connection_args): if conn_args: method = "usergroup.get" # Versions above 2.4 allow retrieving user group permissions - if _LooseVersion(zabbix_version) > _LooseVersion("2.5"): + if Version(zabbix_version) > Version("2.5"): params = {"selectRights": "extend", "output": "extend", "filter": {}} else: params = {"output": "extend", "filter": {}} @@ -1392,7 +1386,7 @@ def host_exists( try: if conn_args: # hostgroup.exists deprecated - if _LooseVersion(zabbix_version) > _LooseVersion("2.5"): + if Version(zabbix_version) > Version("2.5"): if not host: host = None if not name: @@ -1412,7 +1406,7 @@ def host_exists( if name: params["name"] = name # deprecated in 2.4 - if _LooseVersion(zabbix_version) < _LooseVersion("2.4"): + if Version(zabbix_version) < Version("2.4"): if node: params["node"] = node if nodeids: @@ -1774,7 +1768,7 @@ def hostgroup_exists( try: if conn_args: # hostgroup.exists deprecated - if _LooseVersion(zabbix_version) > _LooseVersion("2.5"): + if Version(zabbix_version) > Version("2.5"): if not groupid: groupid = None if not name: @@ -1790,7 +1784,7 @@ def hostgroup_exists( if name: params["name"] = name # deprecated in 2.4 - if _LooseVersion(zabbix_version) < _LooseVersion("2.4"): + if Version(zabbix_version) < Version("2.4"): if node: params["node"] = node if nodeids: @@ -2470,7 +2464,7 @@ def mediatype_get(name=None, mediatypeids=None, **connection_args): params = {"output": "extend", "filter": {}} if name: # since zabbix API 4.4, mediatype has new attribute: name - if _LooseVersion(zabbix_version) >= _LooseVersion("4.4"): + if Version(zabbix_version) >= Version("4.4"): params["filter"].setdefault("name", name) else: params["filter"].setdefault("description", name) @@ -2524,7 +2518,7 @@ def mediatype_create(name, mediatype, **connection_args): if conn_args: method = "mediatype.create" # since zabbix 4.4 api, mediatype has new attribute: name - if _LooseVersion(zabbix_version) >= _LooseVersion("4.4"): + if Version(zabbix_version) >= Version("4.4"): params = {"name": name} _ignore_name = False else: @@ -2766,14 +2760,14 @@ def configuration_import(config_file, rules=None, file_format="xml", **connectio }, "valueMaps": {"createMissing": True, "updateExisting": False}, } - if _LooseVersion(zabbix_version) >= _LooseVersion("3.2"): + if Version(zabbix_version) >= Version("3.2"): # rules/httptests added default_rules["httptests"] = { "createMissing": True, "updateExisting": True, "deleteMissing": False, } - if _LooseVersion(zabbix_version) >= _LooseVersion("3.4"): + if Version(zabbix_version) >= Version("3.4"): # rules/applications/upateExisting deprecated default_rules["applications"] = {"createMissing": True, "deleteMissing": False} else: diff --git a/salt/netapi/rest_cherrypy/__init__.py b/salt/netapi/rest_cherrypy/__init__.py index 2eee8dabb04..fbc85c9ff60 100644 --- a/salt/netapi/rest_cherrypy/__init__.py +++ b/salt/netapi/rest_cherrypy/__init__.py @@ -7,6 +7,8 @@ This is run by ``salt-api`` and started in a multiprocess. import logging import os +from salt.utils.versions import Version + # pylint: disable=C0103 @@ -39,9 +41,9 @@ def __virtual__(): # CherryPy wasn't imported; explain why if cpy_error: - from salt.utils.versions import LooseVersion as V - - if "cherrypy" in globals() and V(cherrypy.__version__) < V(cpy_min): + if "cherrypy" in globals() and Version(cherrypy.__version__) < Version( + cpy_min + ): error_msg = "Required version of CherryPy is {} or greater.".format( cpy_min ) diff --git a/salt/netapi/rest_tornado/__init__.py b/salt/netapi/rest_tornado/__init__.py index 3fa7547c4b7..67336d0adaa 100644 --- a/salt/netapi/rest_tornado/__init__.py +++ b/salt/netapi/rest_tornado/__init__.py @@ -3,7 +3,7 @@ import logging import os import salt.auth -from salt.utils.versions import StrictVersion as _StrictVersion +from salt.utils.versions import Version __virtualname__ = os.path.abspath(__file__).rsplit(os.sep)[-2] or "rest_tornado" @@ -15,7 +15,7 @@ has_tornado = False try: import salt.ext.tornado - if _StrictVersion(salt.ext.tornado.version) >= _StrictVersion(min_tornado_version): + if Version(salt.ext.tornado.version) >= Version(min_tornado_version): has_tornado = True else: log.error("rest_tornado requires at least tornado %s", min_tornado_version) diff --git a/salt/pillar/ec2_pillar.py b/salt/pillar/ec2_pillar.py index f6fa734a6f8..e197940908b 100644 --- a/salt/pillar/ec2_pillar.py +++ b/salt/pillar/ec2_pillar.py @@ -57,7 +57,7 @@ instance. import logging import re -from salt.utils.versions import StrictVersion as _StrictVersion +from salt.utils.versions import Version try: import boto.ec2 @@ -82,8 +82,8 @@ def __virtual__(): """ if not HAS_BOTO: return False - boto_version = _StrictVersion(boto.__version__) - required_boto_version = _StrictVersion("2.8.0") + boto_version = Version(boto.__version__) + required_boto_version = Version("2.8.0") if boto_version < required_boto_version: log.error( "%s: installed boto version %s < %s, can't retrieve instance data", diff --git a/salt/returners/mongo_future_return.py b/salt/returners/mongo_future_return.py index 58a63daa5d5..d45b05784f4 100644 --- a/salt/returners/mongo_future_return.py +++ b/salt/returners/mongo_future_return.py @@ -96,12 +96,12 @@ import logging import salt.returners import salt.utils.jid -from salt.utils.versions import LooseVersion as _LooseVersion +from salt.utils.versions import Version try: import pymongo - PYMONGO_VERSION = _LooseVersion(pymongo.version) + PYMONGO_VERSION = Version(pymongo.version) HAS_PYMONGO = True except ImportError: HAS_PYMONGO = False @@ -167,7 +167,7 @@ def _get_conn(ret): # at some point we should remove support for # pymongo versions < 2.3 until then there are # a bunch of these sections that need to be supported - if uri and PYMONGO_VERSION > _LooseVersion("2.3"): + if uri and PYMONGO_VERSION > Version("2.3"): if uri and host: raise salt.exceptions.SaltConfigurationError( "Mongo returner expects either uri or host configuration. Both were" @@ -177,7 +177,7 @@ def _get_conn(ret): conn = pymongo.MongoClient(uri) mdb = conn.get_database() else: - if PYMONGO_VERSION > _LooseVersion("2.3"): + if PYMONGO_VERSION > Version("2.3"): conn = pymongo.MongoClient(host, port, username=user, password=password) else: if uri: @@ -189,7 +189,7 @@ def _get_conn(ret): mdb = conn[db_] if indexes: - if PYMONGO_VERSION > _LooseVersion("2.3"): + if PYMONGO_VERSION > Version("2.3"): mdb.saltReturns.create_index("minion") mdb.saltReturns.create_index("jid") mdb.jobs.create_index("jid") @@ -236,7 +236,7 @@ def returner(ret): # # again we run into the issue with deprecated code from previous versions - if PYMONGO_VERSION > _LooseVersion("2.3"): + if PYMONGO_VERSION > Version("2.3"): # using .copy() to ensure that the original data is not changed, raising issue with pymongo team mdb.saltReturns.insert_one(sdata.copy()) else: @@ -291,7 +291,7 @@ def save_load(jid, load, minions=None): conn, mdb = _get_conn(ret=None) to_save = _safe_copy(load) - if PYMONGO_VERSION > _LooseVersion("2.3"): + if PYMONGO_VERSION > Version("2.3"): # using .copy() to ensure original data for load is unchanged mdb.jobs.insert_one(to_save) else: @@ -384,7 +384,7 @@ def event_return(events): if isinstance(events, dict): log.debug(events) - if PYMONGO_VERSION > _LooseVersion("2.3"): + if PYMONGO_VERSION > Version("2.3"): mdb.events.insert_one(events.copy()) else: mdb.events.insert(events.copy()) diff --git a/salt/returners/mongo_return.py b/salt/returners/mongo_return.py index ab879a4967e..91d0b508a67 100644 --- a/salt/returners/mongo_return.py +++ b/salt/returners/mongo_return.py @@ -64,12 +64,12 @@ import logging import salt.returners import salt.utils.jid -from salt.utils.versions import LooseVersion as _LooseVersion +from salt.utils.versions import Version try: import pymongo - PYMONGO_VERSION = _LooseVersion(pymongo.version) + PYMONGO_VERSION = Version(pymongo.version) HAS_PYMONGO = True except ImportError: HAS_PYMONGO = False @@ -136,7 +136,7 @@ def _get_conn(ret): # pymongo versions < 2.3 until then there are # a bunch of these sections that need to be supported - if PYMONGO_VERSION > _LooseVersion("2.3"): + if PYMONGO_VERSION > Version("2.3"): conn = pymongo.MongoClient(host, port) else: conn = pymongo.Connection(host, port) @@ -146,7 +146,7 @@ def _get_conn(ret): mdb.authenticate(user, password) if indexes: - if PYMONGO_VERSION > _LooseVersion("2.3"): + if PYMONGO_VERSION > Version("2.3"): mdb.saltReturns.create_index("minion") mdb.saltReturns.create_index("jid") @@ -194,7 +194,7 @@ def returner(ret): # again we run into the issue with deprecated code from previous versions - if PYMONGO_VERSION > _LooseVersion("2.3"): + if PYMONGO_VERSION > Version("2.3"): # using .copy() to ensure original data for load is unchanged mdb.saltReturns.insert_one(sdata.copy()) else: diff --git a/salt/returners/xmpp_return.py b/salt/returners/xmpp_return.py index 88186b25f18..c3565ad589a 100644 --- a/salt/returners/xmpp_return.py +++ b/salt/returners/xmpp_return.py @@ -71,7 +71,7 @@ import logging import pprint import salt.returners -from salt.utils.versions import LooseVersion as _LooseVersion +from salt.utils.versions import Version HAS_LIBS = False try: @@ -127,8 +127,8 @@ def __virtual__(): import sleekxmpp # pylint: disable=3rd-party-module-not-gated # Certain XMPP functionaility we're using doesn't work with versions under 1.3.1 - sleekxmpp_version = _LooseVersion(sleekxmpp.__version__) - valid_version = _LooseVersion(min_version) + sleekxmpp_version = Version(sleekxmpp.__version__) + valid_version = Version(min_version) if sleekxmpp_version >= valid_version: return __virtualname__ return ( diff --git a/salt/runners/winrepo.py b/salt/runners/winrepo.py index b2e1b43bd90..9e31040884c 100644 --- a/salt/runners/winrepo.py +++ b/salt/runners/winrepo.py @@ -31,6 +31,12 @@ PER_REMOTE_ONLY = salt.utils.gitfs.PER_REMOTE_ONLY GLOBAL_ONLY = ("branch",) +def _legacy_git(): + return not any( + (salt.utils.gitfs.GITPYTHON_VERSION, salt.utils.gitfs.PYGIT2_VERSION) + ) + + def genrepo(opts=None, fire_event=True): """ Generate winrepo_cachefile based on sls files in the winrepo_dir @@ -154,9 +160,7 @@ def update_git_repos(opts=None, clean=False, masterless=False): ret = {} for remotes, base_dir in winrepo_cfg: - if not any( - (salt.utils.gitfs.GITPYTHON_VERSION, salt.utils.gitfs.PYGIT2_VERSION) - ): + if _legacy_git(): # Use legacy code winrepo_result = {} for remote_info in remotes: diff --git a/salt/states/boto3_elasticsearch.py b/salt/states/boto3_elasticsearch.py index 970f2376c55..ff0dae55457 100644 --- a/salt/states/boto3_elasticsearch.py +++ b/salt/states/boto3_elasticsearch.py @@ -47,7 +47,7 @@ Manage Elasticsearch Service import logging import salt.utils.json -from salt.utils.versions import LooseVersion +from salt.utils.versions import Version log = logging.getLogger(__name__) __virtualname__ = "boto3_elasticsearch" @@ -544,7 +544,7 @@ def upgraded( "at the desired version {}" "".format(name, elasticsearch_version) ) - elif LooseVersion(elasticsearch_version) < LooseVersion(current_version): + elif Version(elasticsearch_version) < Version(current_version): ret["result"] = False ret["comment"].append( 'Elasticsearch domain "{}" cannot be downgraded ' diff --git a/salt/states/git.py b/salt/states/git.py index 307c2651f89..0f3f977442e 100644 --- a/salt/states/git.py +++ b/salt/states/git.py @@ -21,7 +21,7 @@ import salt.utils.files import salt.utils.url import salt.utils.versions from salt.exceptions import CommandExecutionError -from salt.utils.versions import LooseVersion as _LooseVersion +from salt.utils.versions import Version log = logging.getLogger(__name__) @@ -32,8 +32,8 @@ def __virtual__(): """ if "git.version" not in __salt__: return (False, "git module could not be loaded") - git_ver = _LooseVersion(__salt__["git.version"](versioninfo=False)) - return git_ver >= _LooseVersion("1.6.5") + git_ver = Version(__salt__["git.version"](versioninfo=False)) + return git_ver >= Version("1.6.5") def _revs_equal(rev1, rev2, rev_type): @@ -88,10 +88,10 @@ def _get_branch_opts( return None if git_ver is None: - git_ver = _LooseVersion(__salt__["git.version"](versioninfo=False)) + git_ver = Version(__salt__["git.version"](versioninfo=False)) ret = [] - if git_ver >= _LooseVersion("1.8.0"): + if git_ver >= Version("1.8.0"): ret.extend(["--set-upstream-to", desired_upstream]) else: ret.append("--set-upstream") @@ -828,7 +828,7 @@ def latest( "No revision matching '{}' exists in the remote repository".format(rev), ) - git_ver = _LooseVersion(__salt__["git.version"](versioninfo=False)) + git_ver = Version(__salt__["git.version"](versioninfo=False)) check = "refs" if bare else ".git" gitdir = os.path.join(target, check) @@ -1313,7 +1313,7 @@ def latest( # can only do this if the git version is 1.8.0 or newer, as # the --unset-upstream option was not added until that # version. - if git_ver >= _LooseVersion("1.8.0"): + if git_ver >= Version("1.8.0"): upstream_action = "Tracking branch was unset" branch_opts = ["--unset-upstream"] else: @@ -1575,7 +1575,7 @@ def latest( output_encoding=output_encoding, ): - if git_ver >= _LooseVersion("1.8.1.6"): + if git_ver >= Version("1.8.1.6"): # --ff-only added in version 1.8.1.6. It's not # 100% necessary, but if we can use it, we'll # ensure that the merge doesn't go through if @@ -1909,7 +1909,7 @@ def latest( # we can only do this if the git version is 1.8.0 or # newer, as the --unset-upstream option was not added # until that version. - if git_ver >= _LooseVersion("1.8.0"): + if git_ver >= Version("1.8.0"): upstream_action = "Tracking branch was unset" branch_opts = ["--unset-upstream"] else: diff --git a/salt/states/mac_assistive.py b/salt/states/mac_assistive.py index cf18007fbd3..8aee4ccffec 100644 --- a/salt/states/mac_assistive.py +++ b/salt/states/mac_assistive.py @@ -14,7 +14,7 @@ Install, enable and disable assistive access on macOS minions import logging import salt.utils.platform -from salt.utils.versions import LooseVersion as _LooseVersion +from salt.utils.versions import Version log = logging.getLogger(__name__) @@ -25,9 +25,9 @@ def __virtual__(): """ Only work on Mac OS """ - if salt.utils.platform.is_darwin() and _LooseVersion( - __grains__["osrelease"] - ) >= _LooseVersion("10.9"): + if salt.utils.platform.is_darwin() and Version(__grains__["osrelease"]) >= Version( + "10.9" + ): return True return (False, "Only supported on Mac OS 10.9+") diff --git a/salt/states/zabbix_user.py b/salt/states/zabbix_user.py index 343f688ec5d..51158b2e599 100644 --- a/salt/states/zabbix_user.py +++ b/salt/states/zabbix_user.py @@ -12,7 +12,7 @@ from copy import deepcopy import salt.utils.json from salt.exceptions import SaltException -from salt.utils.versions import LooseVersion as _LooseVersion +from salt.utils.versions import Version log = logging.getLogger(__name__) @@ -313,7 +313,7 @@ def present(alias, passwd, usrgrps, medias=None, password_reset=False, **kwargs) if update_usrgrps or password_reset or update_medias: ret["comment"] = comment_user_updated - if _LooseVersion(zabbix_version) > _LooseVersion("3.4"): + if Version(zabbix_version) > Version("3.4"): updates = deepcopy(connection_args) if update_usrgrps: updates["usrgrps"] = usrgrps diff --git a/salt/utils/gitfs.py b/salt/utils/gitfs.py index 01306b4ee6b..cc9895d8ab9 100644 --- a/salt/utils/gitfs.py +++ b/salt/utils/gitfs.py @@ -39,7 +39,7 @@ from salt.exceptions import FileserverConfigError, GitLockError, get_error_messa from salt.utils.event import tagify from salt.utils.odict import OrderedDict from salt.utils.process import os_is_running as pid_exists -from salt.utils.versions import LooseVersion as _LooseVersion +from salt.utils.versions import Version VALID_REF_TYPES = _DEFAULT_MASTER_OPTS["gitfs_ref_types"] @@ -95,7 +95,7 @@ try: import git import gitdb - GITPYTHON_VERSION = _LooseVersion(git.__version__) + GITPYTHON_VERSION = Version(git.__version__) except Exception: # pylint: disable=broad-except GITPYTHON_VERSION = None @@ -106,13 +106,13 @@ try: with warnings.catch_warnings(): warnings.simplefilter("ignore") import pygit2 - PYGIT2_VERSION = _LooseVersion(pygit2.__version__) - LIBGIT2_VERSION = _LooseVersion(pygit2.LIBGIT2_VERSION) + PYGIT2_VERSION = Version(pygit2.__version__) + LIBGIT2_VERSION = Version(pygit2.LIBGIT2_VERSION) # Work around upstream bug where bytestrings were being decoded using the # default encoding (which is usually ascii on Python 2). This was fixed # on 2 Feb 2018, so releases prior to 0.26.3 will need a workaround. - if PYGIT2_VERSION <= _LooseVersion("0.26.3"): + if PYGIT2_VERSION <= Version("0.26.3"): try: import pygit2.ffi import pygit2.remote @@ -150,9 +150,9 @@ except Exception as exc: # pylint: disable=broad-except # pylint: enable=import-error # Minimum versions for backend providers -GITPYTHON_MINVER = _LooseVersion("0.3") -PYGIT2_MINVER = _LooseVersion("0.20.3") -LIBGIT2_MINVER = _LooseVersion("0.20.0") +GITPYTHON_MINVER = Version("0.3") +PYGIT2_MINVER = Version("0.20.3") +LIBGIT2_MINVER = Version("0.20.0") def enforce_types(key, val): @@ -1780,7 +1780,7 @@ class Pygit2(GitProvider): self.gitdir = salt.utils.path.join(self.repo.workdir, ".git") self.enforce_git_config() git_config = os.path.join(self.gitdir, "config") - if os.path.exists(git_config) and PYGIT2_VERSION >= _LooseVersion("0.28.0"): + if os.path.exists(git_config) and PYGIT2_VERSION >= Version("0.28.0"): self.repo.config.add_file(git_config) return new @@ -2057,7 +2057,7 @@ class Pygit2(GitProvider): """ Assign attributes for pygit2 callbacks """ - if PYGIT2_VERSION >= _LooseVersion("0.23.2"): + if PYGIT2_VERSION >= Version("0.23.2"): self.remotecallbacks = pygit2.RemoteCallbacks(credentials=self.credentials) if not self.ssl_verify: # Override the certificate_check function with a lambda that diff --git a/salt/utils/jinja.py b/salt/utils/jinja.py index ed076a7b1ae..17222b5720c 100644 --- a/salt/utils/jinja.py +++ b/salt/utils/jinja.py @@ -33,7 +33,7 @@ import salt.utils.yaml from salt.exceptions import TemplateError from salt.utils.decorators.jinja import jinja_filter, jinja_global, jinja_test from salt.utils.odict import OrderedDict -from salt.utils.versions import LooseVersion +from salt.utils.versions import Version try: from markupsafe import Markup @@ -46,7 +46,7 @@ log = logging.getLogger(__name__) __all__ = ["SaltCacheLoader", "SerializerExtension"] GLOBAL_UUID = uuid.UUID("91633EBF-1C86-5E33-935A-28061F4B480E") -JINJA_VERSION = LooseVersion(jinja2.__version__) +JINJA_VERSION = Version(jinja2.__version__) class SaltCacheLoader(BaseLoader): diff --git a/salt/utils/network.py b/salt/utils/network.py index e9bd69ed76d..2bea2cf1293 100644 --- a/salt/utils/network.py +++ b/salt/utils/network.py @@ -26,7 +26,7 @@ import salt.utils.stringutils from salt._compat import ipaddress from salt.exceptions import SaltClientError, SaltSystemExit from salt.utils.decorators.jinja import jinja_filter -from salt.utils.versions import LooseVersion +from salt.utils.versions import Version try: import salt.utils.win_network @@ -1096,7 +1096,7 @@ def netbsd_interfaces(): address) """ # NetBSD versions prior to 8.0 can still use linux_interfaces() - if LooseVersion(os.uname()[2]) < LooseVersion("8.0"): + if Version(os.uname()[2]) < Version("8.0"): return linux_interfaces() ifconfig_path = salt.utils.path.which("ifconfig") diff --git a/salt/utils/openstack/nova.py b/salt/utils/openstack/nova.py index d35f7fc7eb4..4c3855edb31 100644 --- a/salt/utils/openstack/nova.py +++ b/salt/utils/openstack/nova.py @@ -10,7 +10,7 @@ import time import salt.utils.cloud import salt.utils.files from salt.exceptions import SaltCloudSystemExit -from salt.utils.versions import LooseVersion as _LooseVersion +from salt.utils.versions import Version HAS_NOVA = False # pylint: disable=import-error @@ -63,9 +63,9 @@ CLIENT_BDM2_KEYS = { def check_nova(): if HAS_NOVA: - novaclient_ver = _LooseVersion(novaclient.__version__) - min_ver = _LooseVersion(NOVACLIENT_MINVER) - max_ver = _LooseVersion(NOVACLIENT_MAXVER) + novaclient_ver = Version(novaclient.__version__) + min_ver = Version(NOVACLIENT_MINVER) + max_ver = Version(NOVACLIENT_MAXVER) if min_ver <= novaclient_ver <= max_ver: return HAS_NOVA elif novaclient_ver > max_ver: diff --git a/salt/utils/pkg/win.py b/salt/utils/pkg/win.py index c09c187cb1b..c34fa2c26b3 100644 --- a/salt/utils/pkg/win.py +++ b/salt/utils/pkg/win.py @@ -1,16 +1,3 @@ -# Copyright 2017 Damon Atkins -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. r""" Collect information about software installed on Windows OS ================ @@ -23,12 +10,6 @@ Collect information about software installed on Windows OS Known Issue: install_date may not match Control Panel\Programs\Programs and Features """ - -# Note although this code will work with Python 2.7, win32api does not -# support Unicode. i.e non ASCII characters may be returned with unexpected -# results e.g. a '?' instead of the correct character -# Python 3.6 or newer is recommended. - import collections import datetime import locale @@ -72,7 +53,7 @@ try: except ImportError: from collections import OrderedDict -from salt.utils.versions import LooseVersion +from salt.utils.versions import Version # pylint: disable=too-many-instance-attributes @@ -864,14 +845,14 @@ class WinSoftware: """ Used for sorting version numbers oldest to latest """ - return 1 if LooseVersion(ver1) > LooseVersion(ver2) else -1 + return 1 if Version(ver1) > Version(ver2) else -1 @staticmethod def __latest_to_oldest_version(ver1, ver2): """ Used for sorting version numbers, latest to oldest """ - return 1 if LooseVersion(ver1) < LooseVersion(ver2) else -1 + return 1 if Version(ver1) < Version(ver2) else -1 def pkg_version_list(self, pkg_id): """ @@ -1189,7 +1170,7 @@ class WinSoftware: # Not expecting the list to be big, simple search and insert insert_point = 0 for ver_item in self.__reg_software[dict_key]: - if LooseVersion(version_text) <= LooseVersion(ver_item): + if Version(version_text) <= Version(ver_item): break insert_point += 1 self.__reg_software[dict_key].insert(insert_point, version_text) diff --git a/salt/utils/templates.py b/salt/utils/templates.py index 33fa989252b..2c2f1aa58f0 100644 --- a/salt/utils/templates.py +++ b/salt/utils/templates.py @@ -29,7 +29,7 @@ from salt.exceptions import CommandExecutionError, SaltInvocationError, SaltRend from salt.loader.context import NamedLoaderContext from salt.utils.decorators.jinja import JinjaFilter, JinjaGlobal, JinjaTest from salt.utils.odict import OrderedDict -from salt.utils.versions import LooseVersion +from salt.utils.versions import Version if sys.version_info[:2] >= (3, 5): import importlib.machinery # pylint: disable=no-name-in-module,import-error @@ -434,7 +434,7 @@ def render_jinja_tmpl(tmplstr, context, tmplpath=None): indent_filter = jinja_env.filters.get("indent") jinja_env.tests.update(JinjaTest.salt_jinja_tests) jinja_env.filters.update(JinjaFilter.salt_jinja_filters) - if salt.utils.jinja.JINJA_VERSION >= LooseVersion("2.11"): + if salt.utils.jinja.JINJA_VERSION >= Version("2.11"): # Use the existing indent filter on Jinja versions where it's not broken jinja_env.filters["indent"] = indent_filter jinja_env.globals.update(JinjaGlobal.salt_jinja_globals) diff --git a/salt/utils/thin.py b/salt/utils/thin.py index b7d79f51ff6..d2d2a08bdf9 100644 --- a/salt/utils/thin.py +++ b/salt/utils/thin.py @@ -17,7 +17,9 @@ import zipfile import distro import jinja2 +import looseversion import msgpack +import packaging import yaml import salt @@ -279,6 +281,8 @@ def get_tops_python(py_ver, exclude=None, ext_py_ver=None): "ssl_match_hostname", "markupsafe", "backports_abc", + "looseversion", + "packaging", ] if ext_py_ver and tuple(ext_py_ver) >= (3, 0): mods.append("distro") @@ -426,6 +430,8 @@ def get_tops(extra_mods="", so_mods=""): ssl_match_hostname, markupsafe, backports_abc, + looseversion, + packaging, ] modules = find_site_modules("contextvars") if modules: diff --git a/salt/utils/versions.py b/salt/utils/versions.py index d4d24212eba..55ac9599e7e 100644 --- a/salt/utils/versions.py +++ b/salt/utils/versions.py @@ -1,13 +1,10 @@ """ - :copyright: Copyright 2017 by the SaltStack Team, see AUTHORS for more details. - :license: Apache 2.0, see LICENSE for more details. - - salt.utils.versions ~~~~~~~~~~~~~~~~~~~ - Version parsing based on distutils.version which works under python 3 - because on python 3 you can no longer compare strings against integers. + Version parsing based on `packaging.version` and `looseversion.LooseVersion` + which works under python 3 because on python 3 you can no longer compare + strings against integers. """ @@ -18,40 +15,49 @@ import numbers import sys import warnings -# pylint: disable=blacklisted-module -try: - from setuptools.distutils.version import LooseVersion as _LooseVersion - from setuptools.distutils.version import StrictVersion as _StrictVersion -except ImportError: - try: - from setuptools._distutils.version import LooseVersion as _LooseVersion - from setuptools._distutils.version import StrictVersion as _StrictVersion - except ImportError: - from distutils.version import LooseVersion as _LooseVersion - from distutils.version import StrictVersion as _StrictVersion +import looseversion +import packaging.version - -# pylint: enable=blacklisted-module import salt.version -# pylint: disable=blacklisted-module log = logging.getLogger(__name__) -class StrictVersion(_StrictVersion): - def parse(self, vstring): - _StrictVersion.parse(self, vstring) - - def _cmp(self, other): +class Version(packaging.version.Version): + def __lt__(self, other): if isinstance(other, str): - other = StrictVersion(other) - return _StrictVersion._cmp(self, other) + other = Version(other) + return super().__lt__(other) + + def __le__(self, other): + if isinstance(other, str): + other = Version(other) + return super().__le__(other) + + def __eq__(self, other): + if isinstance(other, str): + other = Version(other) + return super().__eq__(other) + + def __ge__(self, other): + if isinstance(other, str): + other = Version(other) + return super().__ge__(other) + + def __gt__(self, other): + if isinstance(other, str): + other = Version(other) + return super().__gt__(other) + + def __ne__(self, other): + if isinstance(other, str): + other = Version(other) + return super().__ne__(other) -class LooseVersion(_LooseVersion): +class LooseVersion(looseversion.LooseVersion): def parse(self, vstring): - _LooseVersion.parse(self, vstring) - + super().parse(vstring) # Convert every part of the version to string in order to be able to compare self._str_version = [ str(vp).zfill(8) if isinstance(vp, int) else vp for vp in self.version @@ -68,7 +74,7 @@ class LooseVersion(_LooseVersion): break if string_in_version is False: - return _LooseVersion._cmp(self, other) + return super()._cmp(other) # If we reached this far, it means at least a part of the version contains a string # In python 3, strings and integers are not comparable @@ -313,7 +319,7 @@ def kwargs_warn_until( def version_cmp(pkg1, pkg2, ignore_epoch=False): """ - Compares two version strings using salt.utils.versions.LooseVersion. This + Compares two version strings using `LooseVersion`. This is a fallback for providers which don't have a version comparison utility built into them. Return -1 if version1 < version2, 0 if version1 == version2, and 1 if version1 > version2. Return None if there was a problem diff --git a/salt/utils/win_dotnet.py b/salt/utils/win_dotnet.py index 50548a51c15..65325da75c3 100644 --- a/salt/utils/win_dotnet.py +++ b/salt/utils/win_dotnet.py @@ -6,7 +6,7 @@ Dot NET functions import salt.utils.platform import salt.utils.win_reg as win_reg -from salt.utils.versions import LooseVersion +from salt.utils.versions import Version __virtualname__ = "dotnet" @@ -147,6 +147,6 @@ def version_at_least(version): the passed version, otherwise ``False`` """ for dotnet_version in versions_list(): - if LooseVersion(dotnet_version) >= LooseVersion(str(version)): + if Version(dotnet_version) >= Version(str(version)): return True return False diff --git a/salt/utils/win_network.py b/salt/utils/win_network.py index 1b2284c1dc0..9a917f44d01 100644 --- a/salt/utils/win_network.py +++ b/salt/utils/win_network.py @@ -23,14 +23,14 @@ depending on the version of Windows this is run on. Once support for Windows import platform from salt._compat import ipaddress -from salt.utils.versions import StrictVersion +from salt.utils.versions import Version IS_WINDOWS = platform.system() == "Windows" __virtualname__ = "win_network" if IS_WINDOWS: - USE_WMI = StrictVersion(platform.version()) < StrictVersion("6.2") + USE_WMI = Version(platform.version()) < Version("6.2") if USE_WMI: import wmi diff --git a/salt/version.py b/salt/version.py index ac30602ea2d..4eb20ee8d72 100644 --- a/salt/version.py +++ b/salt/version.py @@ -713,6 +713,8 @@ def dependency_information(include_salt_cloud=False): ("mysql-python", "MySQLdb", "__version__"), ("cherrypy", "cherrypy", "__version__"), ("docker-py", "docker", "__version__"), + ("packaging", "packaging", "__version__"), + ("looseversion", "looseversion", None), ] if include_salt_cloud: @@ -725,6 +727,14 @@ def dependency_information(include_salt_cloud=False): yield name, attr continue try: + if attr is None: + # Late import to reduce the needed available modules and libs + # installed when running `python salt/version.py` + from salt._compat import importlib_metadata + + version = importlib_metadata.version(imp) + yield name, version + continue imp = __import__(imp) version = getattr(imp, attr) if callable(version): diff --git a/tests/integration/cloud/clouds/test_msazure.py b/tests/integration/cloud/clouds/test_msazure.py index ccebadcb9df..1439d4195d2 100644 --- a/tests/integration/cloud/clouds/test_msazure.py +++ b/tests/integration/cloud/clouds/test_msazure.py @@ -6,7 +6,7 @@ import logging import pytest -from salt.utils.versions import LooseVersion +from salt.utils.versions import Version from tests.integration.cloud.helpers.cloud_test_base import CloudTest try: @@ -31,10 +31,10 @@ def __has_required_azure(): """ if HAS_AZURE: if hasattr(azure, "__version__"): - version = LooseVersion(azure.__version__) + version = Version(azure.__version__) else: - version = LooseVersion(azure.common.__version__) - if LooseVersion(REQUIRED_AZURE) <= version: + version = Version(azure.common.__version__) + if Version(REQUIRED_AZURE) <= version: return True return False diff --git a/tests/integration/modules/test_git.py b/tests/integration/modules/test_git.py index a91e128dc6d..f0d26a59a92 100644 --- a/tests/integration/modules/test_git.py +++ b/tests/integration/modules/test_git.py @@ -29,23 +29,25 @@ log = logging.getLogger(__name__) def _git_version(): - try: - git_version = subprocess.Popen( - ["git", "--version"], - shell=False, - close_fds=False if salt.utils.platform.is_windows() else True, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - ).communicate()[0] - except OSError: - return False - if not git_version: + git = shutil.which("git") + if not git: log.debug("Git not installed") return False - git_version = git_version.strip().split()[-1] - git_version = git_version.decode(__salt_system_encoding__) + ret = subprocess.run( + ["git", "--version"], + stdout=subprocess.PIPE, + check=False, + shell=False, + universal_newlines=True, + ) + # On macOS, the git version is displayed in a different format + # git version 2.21.1 (Apple Git-122.3) + # As opposed to: + # git version 2.21.1 + version_str = ret.stdout.strip().split("(")[0].strip().split()[-1] + git_version = LooseVersion(version_str) log.debug("Detected git version: %s", git_version) - return LooseVersion(git_version) + return git_version def _worktrees_supported(): diff --git a/tests/integration/states/test_git.py b/tests/integration/states/test_git.py index 308bf64ac67..dba4340dabd 100644 --- a/tests/integration/states/test_git.py +++ b/tests/integration/states/test_git.py @@ -16,7 +16,7 @@ import pytest import salt.utils.files import salt.utils.path -from salt.utils.versions import LooseVersion as _LooseVersion +from salt.utils.versions import Version from tests.support.case import ModuleCase from tests.support.helpers import TstSuiteLoggingHandler, with_tempdir from tests.support.mixins import SaltReturnAssertsMixin @@ -36,7 +36,7 @@ def __check_git_version(caller, min_version, skip_msg): if not salt.utils.path.which("git"): self.skipTest("git is not installed") git_version = self.run_function("git.version") - if _LooseVersion(git_version) < _LooseVersion(min_version): + if Version(git_version) < Version(min_version): self.skipTest(skip_msg.format(min_version, git_version)) if actual_setup is not None: actual_setup(self, *args, **kwargs) @@ -49,7 +49,7 @@ def __check_git_version(caller, min_version, skip_msg): if not salt.utils.path.which("git"): self.skipTest("git is not installed") git_version = self.run_function("git.version") - if _LooseVersion(git_version) < _LooseVersion(min_version): + if Version(git_version) < Version(min_version): self.skipTest(skip_msg.format(min_version, git_version)) return caller(self, *args, **kwargs) diff --git a/tests/pytests/functional/loader/test_loader.py b/tests/pytests/functional/loader/test_loader.py index 06b3a4a2a64..963d33f59c3 100644 --- a/tests/pytests/functional/loader/test_loader.py +++ b/tests/pytests/functional/loader/test_loader.py @@ -2,7 +2,7 @@ import json import pytest -import salt.utils.versions +from salt.utils.versions import Version from tests.support.helpers import SaltVirtualEnv from tests.support.pytest.helpers import FakeSaltExtension @@ -275,7 +275,7 @@ def test_extension_discovery_without_reload_with_bundled_importlib_metadata( assert salt_extension.name not in installed_packages if "importlib-metadata" in installed_packages: importlib_metadata_version = installed_packages["importlib-metadata"] - if salt.utils.versions.StrictVersion(importlib_metadata_version) >= "3.3.0": + if Version(importlib_metadata_version) >= Version("3.3.0"): venv.install("-U", "importlib-metadata<3.3.0") code = """ import sys diff --git a/tests/pytests/functional/runners/test_winrepo.py b/tests/pytests/functional/runners/test_winrepo.py index 892155a9752..b22764fbe4d 100644 --- a/tests/pytests/functional/runners/test_winrepo.py +++ b/tests/pytests/functional/runners/test_winrepo.py @@ -1,10 +1,11 @@ import pytest -import salt.utils.gitfs from salt.runners import winrepo from tests.support.mock import patch -pytestmark = [pytest.mark.windows_whitelisted] +pytestmark = [ + pytest.mark.windows_whitelisted, +] @pytest.fixture @@ -49,12 +50,11 @@ def test_legacy_update_git_repos(winrepo_remotes): """ Ensure update git repos works as intended with legacy (non-gitfs) code. """ - with patch.object(salt.utils.gitfs, "GITPYTHON_VERSION", False): - with patch.object(salt.utils.gitfs, "PYGIT2_VERSION", False): - res = winrepo.update_git_repos() + with patch.object(winrepo, "_legacy_git", return_value=True): + res = winrepo.update_git_repos() - assert res + assert res - for remote in winrepo_remotes: - assert remote in res - assert res[remote] + for remote in winrepo_remotes: + assert remote in res + assert res[remote] diff --git a/tests/pytests/functional/states/file/test_patch.py b/tests/pytests/functional/states/file/test_patch.py index 3ea5c587e4d..6dc0e0349ab 100644 --- a/tests/pytests/functional/states/file/test_patch.py +++ b/tests/pytests/functional/states/file/test_patch.py @@ -9,6 +9,7 @@ import pytest import salt.utils.hashutils import salt.utils.platform import salt.utils.versions +from salt.utils.versions import Version pytestmark = [ pytest.mark.windows_whitelisted, @@ -125,11 +126,11 @@ class Patches: @pytest.fixture(scope="module") def _check_min_patch_version(shell): - min_patch_ver = salt.utils.versions.LooseVersion("2.6") + min_patch_ver = Version("2.6") ret = shell.run("patch", "--version") assert ret.returncode == 0 - version = ret.stdout.strip().split()[2] - if salt.utils.versions.LooseVersion(version) < min_patch_ver: + version = ret.stdout.strip().splitlines()[0].split()[-1] + if Version(version) < min_patch_ver: pytest.xfail( "Minimum version of patch not found, expecting {}, found {}".format( min_patch_ver, version diff --git a/tests/pytests/functional/states/test_npm.py b/tests/pytests/functional/states/test_npm.py index f42a892dc04..2899b7985a1 100644 --- a/tests/pytests/functional/states/test_npm.py +++ b/tests/pytests/functional/states/test_npm.py @@ -4,7 +4,7 @@ import shutil import pytest from salt.exceptions import CommandExecutionError -from salt.utils.versions import LooseVersion +from salt.utils.versions import Version pytestmark = [ pytest.mark.slow_test, @@ -116,7 +116,7 @@ def test_npm_cache_clean(npm, npm_version): """ Basic test to determine if NPM successfully cleans its cached packages. """ - if LooseVersion(npm_version) >= LooseVersion(MAX_NPM_VERSION): + if Version(npm_version) >= Version(MAX_NPM_VERSION): pytest.skip("Skip with npm >= 5.0.0 until #41770 is fixed") ret = npm.cache_cleaned(name="unused", force=True) assert ret.result is True diff --git a/tests/pytests/integration/modules/test_virt.py b/tests/pytests/integration/modules/test_virt.py index 39d836b13a3..57ec239c4e9 100644 --- a/tests/pytests/integration/modules/test_virt.py +++ b/tests/pytests/integration/modules/test_virt.py @@ -7,6 +7,7 @@ from xml.etree import ElementTree import pytest +import salt.version from tests.support.virt import SaltVirtMinionContainerFactory docker = pytest.importorskip("docker") @@ -19,6 +20,19 @@ pytestmark = [ ] +def _install_salt_dependencies(container): + dependencies = [] + for package, version in salt.version.dependency_information(): + if package not in ("packaging", "looseversion"): + # These are newer base dependencies which the container might not + # yet have + continue + dependencies.append(f"{package}=={version}") + if dependencies: + ret = container.run("python3", "-m", "pip", "install", *dependencies) + log.debug("Install missing dependecies ret: %s", ret) + + @pytest.fixture(scope="module") def virt_minion_0_id(): return "virt-minion-0" @@ -58,6 +72,7 @@ def virt_minion_0( skip_on_pull_failure=True, skip_if_docker_client_not_connectable=True, ) + factory.before_start(_install_salt_dependencies, factory) factory.after_terminate( pytest.helpers.remove_stale_minion_key, salt_master, factory.id ) @@ -94,6 +109,7 @@ def virt_minion_1( skip_on_pull_failure=True, skip_if_docker_client_not_connectable=True, ) + factory.before_start(_install_salt_dependencies, factory) factory.after_terminate( pytest.helpers.remove_stale_minion_key, salt_master, factory.id ) diff --git a/tests/pytests/integration/states/test_file.py b/tests/pytests/integration/states/test_file.py index 1f741b0223b..9115818bf7e 100644 --- a/tests/pytests/integration/states/test_file.py +++ b/tests/pytests/integration/states/test_file.py @@ -13,7 +13,7 @@ from pytestshellutils.utils import ports import salt.utils.files import salt.utils.path import salt.utils.platform -from salt.utils.versions import LooseVersion as _LooseVersion +from salt.utils.versions import Version log = logging.getLogger(__name__) @@ -487,7 +487,7 @@ def _check_min_patch_version(shell): ret = shell.run("patch", "--version") assert ret.returncode == 0 version = ret.stdout.strip().split()[2] - if _LooseVersion(version) < _LooseVersion(min_patch_ver): + if Version(version) < Version(min_patch_ver): pytest.xfail( "Minimum version of patch not found, expecting {}, found {}".format( min_patch_ver, version diff --git a/tests/pytests/unit/cloud/clouds/test_dimensiondata.py b/tests/pytests/unit/cloud/clouds/test_dimensiondata.py index 830bb69241a..e1968050044 100644 --- a/tests/pytests/unit/cloud/clouds/test_dimensiondata.py +++ b/tests/pytests/unit/cloud/clouds/test_dimensiondata.py @@ -9,7 +9,7 @@ import pytest from salt.cloud.clouds import dimensiondata from salt.exceptions import SaltCloudSystemExit -from salt.utils.versions import LooseVersion +from salt.utils.versions import Version from tests.support.mock import MagicMock from tests.support.mock import __version__ as mock_version from tests.support.mock import patch @@ -29,7 +29,7 @@ try: # with this work-around. This work-around can be removed when the # required minimum version of libcloud is 2.0.0 (See PR #40837 - which # is implemented in Salt 2018.3.0). - if LooseVersion(libcloud.__version__) < LooseVersion("1.4.0"): + if Version(libcloud.__version__) < Version("1.4.0"): import certifi libcloud.security.CA_CERTS_PATH.append(certifi.where()) @@ -144,7 +144,7 @@ def test_import(): with patch("salt.config.check_driver_dependencies", return_value=True) as p: get_deps = dimensiondata.get_dependencies() assert get_deps is True - if LooseVersion(mock_version) >= LooseVersion("2.0.0"): + if Version(mock_version) >= Version("2.0.0"): assert p.call_count >= 1 diff --git a/tests/pytests/unit/cloud/clouds/test_gce.py b/tests/pytests/unit/cloud/clouds/test_gce.py index 784c83c204e..265818016e8 100644 --- a/tests/pytests/unit/cloud/clouds/test_gce.py +++ b/tests/pytests/unit/cloud/clouds/test_gce.py @@ -11,7 +11,7 @@ import pytest from salt.cloud.clouds import gce from salt.exceptions import SaltCloudSystemExit -from salt.utils.versions import LooseVersion +from salt.utils.versions import Version from tests.support.mock import MagicMock from tests.support.mock import __version__ as mock_version from tests.support.mock import call, patch @@ -281,7 +281,7 @@ def test_import(): with patch("salt.config.check_driver_dependencies", return_value=True) as p: get_deps = gce.get_dependencies() assert get_deps is True - if LooseVersion(mock_version) >= LooseVersion("2.0.0"): + if Version(mock_version) >= Version("2.0.0"): p.assert_called_once() diff --git a/tests/pytests/unit/config/schemas/test_ssh.py b/tests/pytests/unit/config/schemas/test_ssh.py index 856de2e8f88..93692edabd4 100644 --- a/tests/pytests/unit/config/schemas/test_ssh.py +++ b/tests/pytests/unit/config/schemas/test_ssh.py @@ -10,17 +10,17 @@ import pytest import salt.utils.stringutils from salt.config.schemas import ssh as ssh_schemas from salt.config.schemas.minion import MinionConfiguration -from salt.utils.versions import LooseVersion as _LooseVersion +from salt.utils.versions import Version try: import jsonschema import jsonschema.exceptions HAS_JSONSCHEMA = True - JSONSCHEMA_VERSION = _LooseVersion(jsonschema.__version__) + JSONSCHEMA_VERSION = Version(jsonschema.__version__) except ImportError: HAS_JSONSCHEMA = False - JSONSCHEMA_VERSION = _LooseVersion("0") + JSONSCHEMA_VERSION = Version("0") def test_config(): @@ -273,7 +273,7 @@ def test_roster_config_validate(): ssh_schemas.RosterItem.serialize(), format_checker=jsonschema.FormatChecker(), ) - if JSONSCHEMA_VERSION < _LooseVersion("2.6.0"): + if JSONSCHEMA_VERSION < Version("2.6.0"): assert ( "Additional properties are not allowed ('target-1:1' was unexpected)" in excinfo.value.message diff --git a/tests/pytests/unit/fileserver/gitfs/test_gitfs.py b/tests/pytests/unit/fileserver/gitfs/test_gitfs.py index 711a625527c..310c211e14c 100644 --- a/tests/pytests/unit/fileserver/gitfs/test_gitfs.py +++ b/tests/pytests/unit/fileserver/gitfs/test_gitfs.py @@ -54,7 +54,7 @@ try: # We still need to use GitPython here for temp repo setup, so we do need to # actually import it. But we don't need import pygit2 in this module, we - # can just use the LooseVersion instances imported along with + # can just use the Version instances imported along with # salt.utils.gitfs to check if we have a compatible version. HAS_GITPYTHON = GITPYTHON_VERSION >= GITPYTHON_MINVER except (ImportError, AttributeError): diff --git a/tests/pytests/unit/fileserver/gitfs/test_gitfs_config.py b/tests/pytests/unit/fileserver/gitfs/test_gitfs_config.py index 0c8d94698a4..afd0cfdc9e2 100644 --- a/tests/pytests/unit/fileserver/gitfs/test_gitfs_config.py +++ b/tests/pytests/unit/fileserver/gitfs/test_gitfs_config.py @@ -18,7 +18,7 @@ try: # We still need to use GitPython here for temp repo setup, so we do need to # actually import it. But we don't need import pygit2 in this module, we - # can just use the LooseVersion instances imported along with + # can just use the Version instances imported along with # salt.utils.gitfs to check if we have a compatible version. HAS_GITPYTHON = GITPYTHON_VERSION >= GITPYTHON_MINVER except (ImportError, AttributeError): diff --git a/tests/pytests/unit/modules/test_git.py b/tests/pytests/unit/modules/test_git.py index 058e850f734..9d7c9ae9fc7 100644 --- a/tests/pytests/unit/modules/test_git.py +++ b/tests/pytests/unit/modules/test_git.py @@ -11,7 +11,7 @@ import subprocess import pytest import salt.modules.git as git_mod # Don't potentially shadow GitPython -from salt.utils.versions import LooseVersion +from salt.utils.versions import Version from tests.support.mock import MagicMock, Mock, patch log = logging.getLogger(__name__) @@ -68,7 +68,7 @@ def _git_version(): log.error("Git not installed") return False log.debug("Detected git version %s", git_version) - return LooseVersion(git_version.split()[-1]) + return Version(git_version.split()[-1]) @pytest.fixture diff --git a/tests/pytests/unit/modules/test_tls.py b/tests/pytests/unit/modules/test_tls.py index a4381c57fb0..6ed24dbaf00 100644 --- a/tests/pytests/unit/modules/test_tls.py +++ b/tests/pytests/unit/modules/test_tls.py @@ -3,7 +3,7 @@ import logging import pytest import salt.modules.tls as tls -from salt.utils.versions import LooseVersion +from salt.utils.versions import Version from tests.support.helpers import SKIP_INITIAL_PHOTONOS_FAILURES from tests.support.mock import MagicMock, mock_open, patch @@ -406,7 +406,7 @@ def test_cert_info(tls_test_data): # package, causes an error on this test. Newer versions of PyOpenSSL do not have # this issue. If 0.14 is installed and we hit this error, skip the test. OpenSSL = pytest.importorskip("OpenSSL") - if LooseVersion(OpenSSL.__version__) == LooseVersion("0.14"): + if Version(OpenSSL.__version__) == Version("0.14"): log.exception(err) pytest.skip( "Encountered a package conflict. OpenSSL version 0.14" @@ -744,7 +744,7 @@ def test_pyOpenSSL_version(): mock_pgt = MagicMock(return_value=pillarval) with patch.dict( tls.__dict__, - {"OpenSSL_version": LooseVersion("0.1.1"), "X509_EXT_ENABLED": False}, + {"OpenSSL_version": Version("0.1.1"), "X509_EXT_ENABLED": False}, ): assert tls.__virtual__() == ( False, @@ -756,7 +756,7 @@ def test_pyOpenSSL_version(): tls.get_extensions(thing) with patch.dict( tls.__dict__, - {"OpenSSL_version": LooseVersion("0.14.1"), "X509_EXT_ENABLED": True}, + {"OpenSSL_version": Version("0.14.1"), "X509_EXT_ENABLED": True}, ): assert tls.__virtual__() with patch.dict(tls.__salt__, {"pillar.get": mock_pgt}): @@ -764,7 +764,7 @@ def test_pyOpenSSL_version(): assert tls.get_extensions("client") == pillarval with patch.dict( tls.__dict__, - {"OpenSSL_version": LooseVersion("0.15.1"), "X509_EXT_ENABLED": True}, + {"OpenSSL_version": Version("0.15.1"), "X509_EXT_ENABLED": True}, ): assert tls.__virtual__() with patch.dict(tls.__salt__, {"pillar.get": mock_pgt}): @@ -793,7 +793,7 @@ def test_pyOpenSSL_version_destructive(tmp_path, tls_test_data): with patch.dict( tls.__dict__, { - "OpenSSL_version": LooseVersion("0.1.1"), + "OpenSSL_version": Version("0.1.1"), "X509_EXT_ENABLED": False, }, ): @@ -809,7 +809,7 @@ def test_pyOpenSSL_version_destructive(tmp_path, tls_test_data): with patch.dict( tls.__dict__, { - "OpenSSL_version": LooseVersion("0.14.1"), + "OpenSSL_version": Version("0.14.1"), "X509_EXT_ENABLED": True, }, ): @@ -825,7 +825,7 @@ def test_pyOpenSSL_version_destructive(tmp_path, tls_test_data): with patch.dict( tls.__dict__, { - "OpenSSL_version": LooseVersion("0.15.1"), + "OpenSSL_version": Version("0.15.1"), "X509_EXT_ENABLED": True, }, ): @@ -864,7 +864,7 @@ def test_pyOpenSSL_version_destructive(tmp_path, tls_test_data): with patch.dict( tls.__dict__, { - "OpenSSL_version": LooseVersion("0.1.1"), + "OpenSSL_version": Version("0.1.1"), "X509_EXT_ENABLED": False, }, ): @@ -875,7 +875,7 @@ def test_pyOpenSSL_version_destructive(tmp_path, tls_test_data): with patch.dict( tls.__dict__, { - "OpenSSL_version": LooseVersion("0.14.1"), + "OpenSSL_version": Version("0.14.1"), "X509_EXT_ENABLED": True, }, ): @@ -885,7 +885,7 @@ def test_pyOpenSSL_version_destructive(tmp_path, tls_test_data): with patch.dict( tls.__dict__, { - "OpenSSL_version": LooseVersion("0.15.1"), + "OpenSSL_version": Version("0.15.1"), "X509_EXT_ENABLED": True, }, ): diff --git a/tests/pytests/unit/returners/test_mongo_future_return.py b/tests/pytests/unit/returners/test_mongo_future_return.py index c9f499827a9..1f59ed4b988 100644 --- a/tests/pytests/unit/returners/test_mongo_future_return.py +++ b/tests/pytests/unit/returners/test_mongo_future_return.py @@ -2,6 +2,7 @@ import pytest import salt.exceptions import salt.returners.mongo_future_return as mongo +from salt.utils.versions import Version from tests.support.mock import patch @@ -17,7 +18,6 @@ def configure_loader_modules(): } -@patch("salt.returners.mongo_future_return.PYMONGO_VERSION", "4.3.2", create=True) def test_config_exception(): opts = { "mongo.host": "localhost", @@ -26,6 +26,10 @@ def test_config_exception(): "mongo.password": "pass", "mongo.uri": "mongodb://root:pass@localhost27017/salt?authSource=admin", } - with patch.dict(mongo.__opts__, opts): + with patch( + "salt.returners.mongo_future_return.PYMONGO_VERSION", + Version("4.3.2"), + create=True, + ), patch.dict(mongo.__opts__, opts): with pytest.raises(salt.exceptions.SaltConfigurationError): mongo.returner({}) diff --git a/tests/pytests/unit/utils/test_versions.py b/tests/pytests/unit/utils/test_versions.py index d7928a236e1..eed78012305 100644 --- a/tests/pytests/unit/utils/test_versions.py +++ b/tests/pytests/unit/utils/test_versions.py @@ -3,33 +3,34 @@ import sys import warnings import pytest +from packaging.version import InvalidVersion import salt.modules.cmdmod import salt.utils.versions import salt.version -from salt.utils.versions import LooseVersion, StrictVersion +from salt.utils.versions import LooseVersion, Version from tests.support.mock import patch def test_prerelease(): - version = StrictVersion("1.2.3a1") - assert version.version == (1, 2, 3) - assert version.prerelease == ("a", 1) + version = Version("1.2.3a1") + assert version.release == (1, 2, 3) + assert version.pre == ("a", 1) assert str(version) == "1.2.3a1" - version = StrictVersion("1.2.0") - assert str(version) == "1.2" + version = Version("1.2.0") + assert str(version) == "1.2.0" @pytest.mark.parametrize( "v1,v2,wanted", ( ("1.5.1", "1.5.2b2", -1), - ("161", "3.10a", ValueError), + ("161", "3.10a", 1), ("8.02", "8.02", 0), - ("3.4j", "1996.07.12", ValueError), - ("3.2.pl0", "3.1.1.6", ValueError), - ("2g6", "11g", ValueError), + ("3.4j", "1996.07.12", InvalidVersion), + ("3.2.pl0", "3.1.1.6", InvalidVersion), + ("2g6", "11g", InvalidVersion), ("0.9", "2.2", -1), ("1.2.1", "1.2", 1), ("1.1", "1.2.2", -1), @@ -38,21 +39,27 @@ def test_prerelease(): ("1.2.2", "1.2", 1), ("1.2", "1.2.2", -1), ("0.4.0", "0.4", 0), - ("1.13++", "5.5.kw", ValueError), - # Added by us + ("1.13++", "5.5.kw", InvalidVersion), ("1.1.1a1", "1.1.1", -1), ), ) def test_cmp_strict(v1, v2, wanted): try: - res = StrictVersion(v1)._cmp(StrictVersion(v2)) + v1i = Version(v1) + v2i = Version(v2) + if v1i == v2i: + res = 0 + elif v1i < v2i: + res = -1 + elif v1i > v2i: + res = 1 assert res == wanted, "cmp({}, {}) should be {}, got {}".format( v1, v2, wanted, res ) - except ValueError: - if wanted is not ValueError: + except InvalidVersion: + if wanted is not InvalidVersion: raise AssertionError( - "cmp({}, {}) shouldn't raise ValueError".format(v1, v2) + "cmp({}, {}) shouldn't raise InvalidVersion".format(v1, v2) ) diff --git a/tests/unit/modules/test_boto3_elasticsearch.py b/tests/unit/modules/test_boto3_elasticsearch.py index 471e7f72eaf..6b82c0abba7 100644 --- a/tests/unit/modules/test_boto3_elasticsearch.py +++ b/tests/unit/modules/test_boto3_elasticsearch.py @@ -10,7 +10,7 @@ import pytest import salt.loader import salt.modules.boto3_elasticsearch as boto3_elasticsearch -from salt.utils.versions import LooseVersion +from salt.utils.versions import Version from tests.support.mixins import LoaderModuleMockMixin from tests.support.mock import MagicMock, patch from tests.support.unit import TestCase @@ -36,7 +36,7 @@ def __virtual__(): """ if not HAS_BOTO3: return False - if LooseVersion(boto3.__version__) < LooseVersion(REQUIRED_BOTO3_VERSION): + if Version(boto3.__version__) < Version(REQUIRED_BOTO3_VERSION): return ( False, "The boto3 module must be greater or equal to version {}".format( @@ -119,7 +119,7 @@ DOMAIN_RET = { @pytest.mark.skipif(HAS_BOTO3 is False, reason="The boto module must be installed.") @pytest.mark.skipif( - LooseVersion(boto3.__version__) < LooseVersion(REQUIRED_BOTO3_VERSION), + Version(boto3.__version__) < Version(REQUIRED_BOTO3_VERSION), reason="The boto3 module must be greater or equal to version {}".format( REQUIRED_BOTO3_VERSION ), diff --git a/tests/unit/modules/test_boto3_route53.py b/tests/unit/modules/test_boto3_route53.py index 82d1e4fea72..9d421471942 100644 --- a/tests/unit/modules/test_boto3_route53.py +++ b/tests/unit/modules/test_boto3_route53.py @@ -8,7 +8,7 @@ import pytest import salt.loader import salt.modules.boto3_route53 as boto3_route53 -from salt.utils.versions import LooseVersion +from salt.utils.versions import Version from tests.support.mixins import LoaderModuleMockMixin from tests.support.mock import MagicMock, patch from tests.support.unit import TestCase @@ -33,7 +33,7 @@ def __virtual__(): """ if not HAS_BOTO3: return False - if LooseVersion(boto3.__version__) < LooseVersion(REQUIRED_BOTO3_VERSION): + if Version(boto3.__version__) < Version(REQUIRED_BOTO3_VERSION): return ( False, "The boto3 module must be greater or equal to version {}".format( @@ -77,7 +77,7 @@ LIST_RESOURCE_RECORD_SETS_RETURN = { @pytest.mark.skipif(HAS_BOTO3 is False, reason="The boto module must be installed.") @pytest.mark.skipif( - LooseVersion(boto3.__version__) < LooseVersion(REQUIRED_BOTO3_VERSION), + Version(boto3.__version__) < Version(REQUIRED_BOTO3_VERSION), reason="The boto3 module must be greater or equal to version {}".format( REQUIRED_BOTO3_VERSION ), diff --git a/tests/unit/modules/test_boto_apigateway.py b/tests/unit/modules/test_boto_apigateway.py index 11d6f14985d..5f3d2a49822 100644 --- a/tests/unit/modules/test_boto_apigateway.py +++ b/tests/unit/modules/test_boto_apigateway.py @@ -8,7 +8,7 @@ import pytest import salt.loader import salt.loader.context import salt.modules.boto_apigateway as boto_apigateway -from salt.utils.versions import LooseVersion +from salt.utils.versions import Version from tests.support.mixins import LoaderModuleMockMixin from tests.support.mock import MagicMock, patch from tests.support.unit import TestCase @@ -138,7 +138,7 @@ def _has_required_boto(): """ if not HAS_BOTO: return False - elif LooseVersion(boto3.__version__) < LooseVersion(required_boto3_version): + elif Version(boto3.__version__) < Version(required_boto3_version): return False else: return True @@ -150,7 +150,7 @@ def _has_required_botocore(): """ if not HAS_BOTO: return False - elif LooseVersion(botocore.__version__) < LooseVersion(required_botocore_version): + elif Version(botocore.__version__) < Version(required_botocore_version): return False else: return True diff --git a/tests/unit/modules/test_boto_cloudtrail.py b/tests/unit/modules/test_boto_cloudtrail.py index ba4c1835cf1..de31ff955a0 100644 --- a/tests/unit/modules/test_boto_cloudtrail.py +++ b/tests/unit/modules/test_boto_cloudtrail.py @@ -7,7 +7,7 @@ import pytest import salt.config import salt.loader import salt.modules.boto_cloudtrail as boto_cloudtrail -from salt.utils.versions import LooseVersion +from salt.utils.versions import Version from tests.support.mixins import LoaderModuleMockMixin from tests.support.mock import MagicMock, patch from tests.support.unit import TestCase @@ -39,7 +39,7 @@ def _has_required_boto(): """ if not HAS_BOTO: return False - elif LooseVersion(boto3.__version__) < LooseVersion(required_boto3_version): + elif Version(boto3.__version__) < Version(required_boto3_version): return False else: return True diff --git a/tests/unit/modules/test_boto_cognitoidentity.py b/tests/unit/modules/test_boto_cognitoidentity.py index 479b12befef..1e213a169ac 100644 --- a/tests/unit/modules/test_boto_cognitoidentity.py +++ b/tests/unit/modules/test_boto_cognitoidentity.py @@ -7,7 +7,7 @@ import pytest import salt.config import salt.loader import salt.modules.boto_cognitoidentity as boto_cognitoidentity -from salt.utils.versions import LooseVersion +from salt.utils.versions import Version from tests.support.mixins import LoaderModuleMockMixin from tests.support.mock import MagicMock, patch from tests.support.unit import TestCase @@ -114,7 +114,7 @@ def _has_required_boto(): """ if not HAS_BOTO: return False - elif LooseVersion(boto3.__version__) < LooseVersion(required_boto3_version): + elif Version(boto3.__version__) < Version(required_boto3_version): return False else: return True diff --git a/tests/unit/modules/test_boto_elasticsearch_domain.py b/tests/unit/modules/test_boto_elasticsearch_domain.py index 8241aedd124..5c5845aa25b 100644 --- a/tests/unit/modules/test_boto_elasticsearch_domain.py +++ b/tests/unit/modules/test_boto_elasticsearch_domain.py @@ -7,7 +7,7 @@ import pytest import salt.loader import salt.modules.boto_elasticsearch_domain as boto_elasticsearch_domain -from salt.utils.versions import LooseVersion +from salt.utils.versions import Version from tests.support.mixins import LoaderModuleMockMixin from tests.support.mock import MagicMock, patch from tests.support.unit import TestCase @@ -37,7 +37,7 @@ def _has_required_boto(): """ if not HAS_BOTO: return False - elif LooseVersion(boto3.__version__) < LooseVersion(required_boto3_version): + elif Version(boto3.__version__) < Version(required_boto3_version): return False else: return True diff --git a/tests/unit/modules/test_boto_elb.py b/tests/unit/modules/test_boto_elb.py index d995448955e..b9602bdf8a9 100644 --- a/tests/unit/modules/test_boto_elb.py +++ b/tests/unit/modules/test_boto_elb.py @@ -8,7 +8,7 @@ import pytest import salt.config import salt.loader import salt.modules.boto_elb as boto_elb -import salt.utils.versions +from salt.utils.versions import Version from tests.support.mixins import LoaderModuleMockMixin from tests.support.mock import MagicMock, patch from tests.support.runtests import RUNTIME_VARS @@ -94,12 +94,10 @@ def _has_required_moto(): if not HAS_MOTO: return False else: - moto_version = salt.utils.versions.LooseVersion( - pkg_resources.get_distribution("moto").version - ) - if moto_version < salt.utils.versions.LooseVersion(required_moto): + moto_version = Version(pkg_resources.get_distribution("moto").version) + if moto_version < Version(required_moto): return False - elif moto_version < salt.utils.versions.LooseVersion(required_moto_py3): + elif moto_version < Version(required_moto_py3): return False return True diff --git a/tests/unit/modules/test_boto_iot.py b/tests/unit/modules/test_boto_iot.py index f5ab8fddd2a..7c96244ce08 100644 --- a/tests/unit/modules/test_boto_iot.py +++ b/tests/unit/modules/test_boto_iot.py @@ -7,7 +7,7 @@ import pytest import salt.config import salt.loader import salt.modules.boto_iot as boto_iot -from salt.utils.versions import LooseVersion +from salt.utils.versions import Version from tests.support.mixins import LoaderModuleMockMixin from tests.support.mock import MagicMock, patch from tests.support.unit import TestCase @@ -41,9 +41,9 @@ def _has_required_boto(): """ if not HAS_BOTO: return False - elif LooseVersion(boto3.__version__) < LooseVersion(required_boto3_version): + elif Version(boto3.__version__) < Version(required_boto3_version): return False - elif LooseVersion(found_botocore_version) < LooseVersion(required_botocore_version): + elif Version(found_botocore_version) < Version(required_botocore_version): return False else: return True diff --git a/tests/unit/modules/test_boto_lambda.py b/tests/unit/modules/test_boto_lambda.py index 718e60dcd52..d32dc9345b6 100644 --- a/tests/unit/modules/test_boto_lambda.py +++ b/tests/unit/modules/test_boto_lambda.py @@ -11,7 +11,7 @@ import salt.loader import salt.modules.boto_lambda as boto_lambda import salt.utils.stringutils from salt.exceptions import SaltInvocationError -from salt.utils.versions import LooseVersion +from salt.utils.versions import Version from tests.support.mixins import LoaderModuleMockMixin from tests.support.mock import MagicMock, patch from tests.support.unit import TestCase @@ -89,9 +89,9 @@ def _has_required_boto(): """ if not HAS_BOTO: return False - elif LooseVersion(boto3.__version__) < LooseVersion(required_boto3_version): + elif Version(boto3.__version__) < Version(required_boto3_version): return False - elif LooseVersion(found_botocore_version) < LooseVersion(required_botocore_version): + elif Version(found_botocore_version) < Version(required_botocore_version): return False else: return True diff --git a/tests/unit/modules/test_boto_route53.py b/tests/unit/modules/test_boto_route53.py index e8b16dbca59..5c257c09c33 100644 --- a/tests/unit/modules/test_boto_route53.py +++ b/tests/unit/modules/test_boto_route53.py @@ -59,10 +59,10 @@ def _has_required_moto(): if not HAS_MOTO: return False else: - moto_version = salt.utils.versions.LooseVersion( + moto_version = salt.utils.versions.Version( pkg_resources.get_distribution("moto").version ) - if moto_version < salt.utils.versions.LooseVersion(required_moto): + if moto_version < salt.utils.versions.Version(required_moto): return False return True diff --git a/tests/unit/modules/test_boto_s3_bucket.py b/tests/unit/modules/test_boto_s3_bucket.py index e5199a6a7aa..8e418a8293c 100644 --- a/tests/unit/modules/test_boto_s3_bucket.py +++ b/tests/unit/modules/test_boto_s3_bucket.py @@ -7,7 +7,7 @@ import pytest import salt.loader import salt.modules.boto_s3_bucket as boto_s3_bucket -from salt.utils.versions import LooseVersion +from salt.utils.versions import Version from tests.support.mixins import LoaderModuleMockMixin from tests.support.mock import MagicMock, patch from tests.support.unit import TestCase @@ -39,7 +39,7 @@ def _has_required_boto(): """ if not HAS_BOTO: return False - elif LooseVersion(boto3.__version__) < LooseVersion(required_boto3_version): + elif Version(boto3.__version__) < Version(required_boto3_version): return False else: return True diff --git a/tests/unit/modules/test_boto_secgroup.py b/tests/unit/modules/test_boto_secgroup.py index 33fdec29da9..05167ffe774 100644 --- a/tests/unit/modules/test_boto_secgroup.py +++ b/tests/unit/modules/test_boto_secgroup.py @@ -10,7 +10,7 @@ import salt.config import salt.loader import salt.modules.boto_secgroup as boto_secgroup from salt.utils.odict import OrderedDict -from salt.utils.versions import LooseVersion +from salt.utils.versions import Version from tests.support.mixins import LoaderModuleMockMixin from tests.support.runtests import RUNTIME_VARS from tests.support.unit import TestCase @@ -88,7 +88,7 @@ def _has_required_boto(): """ if not HAS_BOTO: return False - elif LooseVersion(boto.__version__) < LooseVersion(required_boto_version): + elif Version(boto.__version__) < Version(required_boto_version): return False else: return True diff --git a/tests/unit/modules/test_boto_vpc.py b/tests/unit/modules/test_boto_vpc.py index 566d35e2f23..a670cd3628f 100644 --- a/tests/unit/modules/test_boto_vpc.py +++ b/tests/unit/modules/test_boto_vpc.py @@ -16,7 +16,7 @@ import salt.loader import salt.modules.boto_vpc as boto_vpc from salt.exceptions import CommandExecutionError, SaltInvocationError from salt.modules.boto_vpc import _maybe_set_name_tag, _maybe_set_tags -from salt.utils.versions import LooseVersion +from salt.utils.versions import Version from tests.support.mixins import LoaderModuleMockMixin from tests.support.mock import MagicMock, patch from tests.support.runtests import RUNTIME_VARS @@ -94,7 +94,7 @@ def _has_required_boto(): """ if not HAS_BOTO: return False - elif LooseVersion(boto.__version__) < LooseVersion(required_boto_version): + elif Version(boto.__version__) < Version(required_boto_version): return False else: return True @@ -106,7 +106,7 @@ def _get_boto_version(): """ if not HAS_BOTO: return False - return LooseVersion(boto.__version__) + return Version(boto.__version__) def _get_moto_version(): @@ -114,10 +114,10 @@ def _get_moto_version(): Returns the moto version """ try: - return LooseVersion(str(moto.__version__)) + return Version(str(moto.__version__)) except AttributeError: try: - return LooseVersion(pkg_resources.get_distribution("moto").version) + return Version(pkg_resources.get_distribution("moto").version) except DistributionNotFound: return False @@ -130,7 +130,7 @@ def _has_required_moto(): if not HAS_MOTO: return False else: - if _get_moto_version() < LooseVersion(required_moto_version): + if _get_moto_version() < Version(required_moto_version): return False return True @@ -634,7 +634,7 @@ class BotoVpcTestCase(BotoVpcTestCaseBase, BotoVpcTestCaseMixin): """ # With moto 0.4.25 through 0.4.30, is_default is set to True. # 0.4.24 and older and 0.4.31 and newer, is_default is False - if LooseVersion("0.4.25") <= _get_moto_version() < LooseVersion("0.4.31"): + if Version("0.4.25") <= _get_moto_version() < Version("0.4.31"): is_default = True else: is_default = False diff --git a/tests/unit/modules/test_libcloud_compute.py b/tests/unit/modules/test_libcloud_compute.py index a7c26a193c1..a95a64c1bad 100644 --- a/tests/unit/modules/test_libcloud_compute.py +++ b/tests/unit/modules/test_libcloud_compute.py @@ -6,7 +6,7 @@ import logging import pytest import salt.modules.libcloud_compute as libcloud_compute -from salt.utils.versions import LooseVersion as _LooseVersion +from salt.utils.versions import Version from tests.support.mixins import LoaderModuleMockMixin from tests.support.mock import MagicMock, patch from tests.support.unit import TestCase @@ -27,9 +27,9 @@ try: VolumeSnapshot, ) - if hasattr(libcloud, "__version__") and _LooseVersion( - libcloud.__version__ - ) < _LooseVersion(REQUIRED_LIBCLOUD_VERSION): + if hasattr(libcloud, "__version__") and Version(libcloud.__version__) < Version( + REQUIRED_LIBCLOUD_VERSION + ): raise ImportError() logging.getLogger("libcloud").setLevel(logging.CRITICAL) HAS_LIBCLOUD = True diff --git a/tests/unit/states/test_boto_apigateway.py b/tests/unit/states/test_boto_apigateway.py index 161db1e317d..51c85d6058a 100644 --- a/tests/unit/states/test_boto_apigateway.py +++ b/tests/unit/states/test_boto_apigateway.py @@ -11,7 +11,7 @@ import salt.loader import salt.states.boto_apigateway as boto_apigateway import salt.utils.files import salt.utils.yaml -from salt.utils.versions import LooseVersion +from salt.utils.versions import Version from tests.support.mixins import LoaderModuleMockMixin from tests.support.mock import MagicMock, patch from tests.support.unit import TestCase @@ -374,7 +374,7 @@ def _has_required_boto(): """ if not HAS_BOTO: return False - elif LooseVersion(boto3.__version__) < LooseVersion(required_boto3_version): + elif Version(boto3.__version__) < Version(required_boto3_version): return False else: return True @@ -386,7 +386,7 @@ def _has_required_botocore(): """ if not HAS_BOTO: return False - elif LooseVersion(botocore.__version__) < LooseVersion(required_botocore_version): + elif Version(botocore.__version__) < Version(required_botocore_version): return False else: return True diff --git a/tests/unit/states/test_boto_cognitoidentity.py b/tests/unit/states/test_boto_cognitoidentity.py index bb08bba0175..4354df0546f 100644 --- a/tests/unit/states/test_boto_cognitoidentity.py +++ b/tests/unit/states/test_boto_cognitoidentity.py @@ -7,7 +7,7 @@ import pytest import salt.config import salt.loader import salt.states.boto_cognitoidentity as boto_cognitoidentity -from salt.utils.versions import LooseVersion +from salt.utils.versions import Version from tests.support.mixins import LoaderModuleMockMixin from tests.support.mock import MagicMock, patch from tests.support.unit import TestCase @@ -132,7 +132,7 @@ def _has_required_boto(): """ if not HAS_BOTO: return False - elif LooseVersion(boto3.__version__) < LooseVersion(required_boto3_version): + elif Version(boto3.__version__) < Version(required_boto3_version): return False else: return True diff --git a/tests/unit/states/test_boto_vpc.py b/tests/unit/states/test_boto_vpc.py index 2714c324d7b..95febd66834 100644 --- a/tests/unit/states/test_boto_vpc.py +++ b/tests/unit/states/test_boto_vpc.py @@ -8,7 +8,7 @@ import pytest import salt.config import salt.states.boto_vpc as boto_vpc import salt.utils.botomod as botomod -from salt.utils.versions import LooseVersion +from salt.utils.versions import Version from tests.support.mixins import LoaderModuleMockMixin from tests.support.mock import patch from tests.support.runtests import RUNTIME_VARS @@ -86,7 +86,7 @@ def _has_required_boto(): """ if not HAS_BOTO: return False - elif LooseVersion(boto.__version__) < LooseVersion(required_boto_version): + elif Version(boto.__version__) < Version(required_boto_version): return False else: return True diff --git a/tests/unit/states/test_pip_state.py b/tests/unit/states/test_pip_state.py index e2a7c974520..5e4b6e0af14 100644 --- a/tests/unit/states/test_pip_state.py +++ b/tests/unit/states/test_pip_state.py @@ -413,7 +413,7 @@ class PipStateInstallationErrorTest(TestCase): def test_importable_installation_error(self): extra_requirements = [] for name, version in salt.version.dependency_information(): - if name in ["PyYAML"]: + if name in ["PyYAML", "packaging", "looseversion"]: extra_requirements.append("{}=={}".format(name, version)) failures = {} pip_version_requirements = [ diff --git a/tests/unit/utils/test_boto3mod.py b/tests/unit/utils/test_boto3mod.py index 72ba1283ddf..74f6478e272 100644 --- a/tests/unit/utils/test_boto3mod.py +++ b/tests/unit/utils/test_boto3mod.py @@ -9,7 +9,7 @@ import pytest import salt.loader import salt.utils.boto3mod as boto3mod -from salt.utils.versions import LooseVersion +from salt.utils.versions import Version from tests.support.mixins import LoaderModuleMockMixin from tests.support.mock import MagicMock, patch from tests.support.unit import TestCase @@ -27,7 +27,7 @@ REQUIRED_BOTO3_VERSION = "1.2.1" @pytest.mark.skipif(HAS_BOTO3 is False, reason="The boto module must be installed.") @pytest.mark.skipif( - LooseVersion(boto3.__version__) < LooseVersion(REQUIRED_BOTO3_VERSION), + Version(boto3.__version__) < Version(REQUIRED_BOTO3_VERSION), reason="The boto3 module must be greater or equal to version {}".format( REQUIRED_BOTO3_VERSION ), diff --git a/tests/unit/utils/test_botomod.py b/tests/unit/utils/test_botomod.py index e05de7eb763..bf3ca37a837 100644 --- a/tests/unit/utils/test_botomod.py +++ b/tests/unit/utils/test_botomod.py @@ -5,7 +5,7 @@ import pytest import salt.utils.boto3mod as boto3mod import salt.utils.botomod as botomod from salt.exceptions import SaltInvocationError -from salt.utils.versions import LooseVersion +from salt.utils.versions import Version from tests.support.mixins import LoaderModuleMockMixin from tests.support.mock import MagicMock, patch from tests.support.runtests import RUNTIME_VARS @@ -97,7 +97,7 @@ def _has_required_boto(): """ if not HAS_BOTO: return False - elif LooseVersion(boto.__version__) < LooseVersion(required_boto_version): + elif Version(boto.__version__) < Version(required_boto_version): return False else: return True @@ -111,7 +111,7 @@ def _has_required_boto3(): try: if not HAS_BOTO3: return False - elif LooseVersion(boto3.__version__) < LooseVersion(required_boto3_version): + elif Version(boto3.__version__) < Version(required_boto3_version): return False else: return True @@ -131,9 +131,7 @@ def _has_required_moto(): else: import pkg_resources - if LooseVersion(pkg_resources.get_distribution("moto").version) < LooseVersion( - "0.3.7" - ): + if Version(pkg_resources.get_distribution("moto").version) < Version("0.3.7"): return False return True diff --git a/tests/unit/utils/test_pydsl.py b/tests/unit/utils/test_pydsl.py index 33d131bca8b..4c8e373c1f5 100644 --- a/tests/unit/utils/test_pydsl.py +++ b/tests/unit/utils/test_pydsl.py @@ -11,7 +11,6 @@ import pytest import salt.config import salt.loader import salt.utils.files -import salt.utils.versions from salt.state import HighState from salt.utils.pydsl import PyDslError from tests.support.helpers import with_tempdir diff --git a/tests/unit/utils/test_schema.py b/tests/unit/utils/test_schema.py index 5419f2fde0e..113c6836e07 100644 --- a/tests/unit/utils/test_schema.py +++ b/tests/unit/utils/test_schema.py @@ -6,7 +6,7 @@ import salt.utils.json import salt.utils.schema as schema import salt.utils.stringutils import salt.utils.yaml -from salt.utils.versions import LooseVersion as _LooseVersion +from salt.utils.versions import Version from tests.support.unit import TestCase try: @@ -14,10 +14,10 @@ try: import jsonschema.exceptions HAS_JSONSCHEMA = True - JSONSCHEMA_VERSION = _LooseVersion(jsonschema.__version__) + JSONSCHEMA_VERSION = Version(jsonschema.__version__) except ImportError: HAS_JSONSCHEMA = False - JSONSCHEMA_VERSION = _LooseVersion("0") + JSONSCHEMA_VERSION = Version("0") # pylint: disable=unused-import,function-redefined @@ -531,7 +531,7 @@ class ConfigTestCase(TestCase): jsonschema.validate( {"personal_access_token": "foo"}, Requirements.serialize() ) - if JSONSCHEMA_VERSION >= _LooseVersion("3.0.0"): + if JSONSCHEMA_VERSION >= Version("3.0.0"): self.assertIn( "'ssh_key_file' is a required property", excinfo.exception.message ) @@ -811,7 +811,7 @@ class ConfigTestCase(TestCase): ) @pytest.mark.skipif( - JSONSCHEMA_VERSION <= _LooseVersion("2.5.0"), + JSONSCHEMA_VERSION <= Version("2.5.0"), reason="Requires jsonschema 2.5.0 or greater", ) def test_ipv4_config_validation(self): @@ -1846,7 +1846,7 @@ class ConfigTestCase(TestCase): {"item": {"color": "green", "sides": 4, "surfaces": 4}}, TestConf.serialize(), ) - if JSONSCHEMA_VERSION < _LooseVersion("2.6.0"): + if JSONSCHEMA_VERSION < Version("2.6.0"): self.assertIn( "Additional properties are not allowed", excinfo.exception.message ) @@ -1878,7 +1878,7 @@ class ConfigTestCase(TestCase): jsonschema.validate( {"item": {"sides": "4", "color": "blue"}}, TestConf.serialize() ) - if JSONSCHEMA_VERSION >= _LooseVersion("3.0.0"): + if JSONSCHEMA_VERSION >= Version("3.0.0"): self.assertIn("'4'", excinfo.exception.message) self.assertIn("is not of type", excinfo.exception.message) self.assertIn("'boolean'", excinfo.exception.message) @@ -2003,7 +2003,7 @@ class ConfigTestCase(TestCase): with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo: jsonschema.validate({"item": ["maybe"]}, TestConf.serialize()) - if JSONSCHEMA_VERSION >= _LooseVersion("3.0.0"): + if JSONSCHEMA_VERSION >= Version("3.0.0"): self.assertIn("'maybe'", excinfo.exception.message) self.assertIn("is not one of", excinfo.exception.message) self.assertIn("'yes'", excinfo.exception.message) @@ -2067,7 +2067,7 @@ class ConfigTestCase(TestCase): with self.assertRaises(jsonschema.exceptions.ValidationError) as excinfo: jsonschema.validate({"item": ["maybe"]}, TestConf.serialize()) - if JSONSCHEMA_VERSION >= _LooseVersion("3.0.0"): + if JSONSCHEMA_VERSION >= Version("3.0.0"): self.assertIn("'maybe'", excinfo.exception.message) self.assertIn("is not one of", excinfo.exception.message) self.assertIn("'yes'", excinfo.exception.message) diff --git a/tests/unit/utils/test_thin.py b/tests/unit/utils/test_thin.py index 9e921439de9..7fd1e7b5dc3 100644 --- a/tests/unit/utils/test_thin.py +++ b/tests/unit/utils/test_thin.py @@ -80,6 +80,8 @@ class SSHThinTestCase(TestCase): "msgpack": str(code_dir / "msgpack"), "certifi": str(code_dir / "certifi"), "singledispatch": str(code_dir / "singledispatch.py"), + "looseversion": str(code_dir / "looseversion.py"), + "packaging": str(code_dir / "packaging"), } self.exc_libs = ["jinja2", "yaml"] @@ -436,6 +438,14 @@ class SSHThinTestCase(TestCase): "salt.utils.thin.py_contextvars", type("contextvars", (), {"__file__": "/site-packages/contextvars"}), ) + @patch( + "salt.utils.thin.packaging", + type("packaging", (), {"__file__": "/site-packages/packaging"}), + ) + @patch( + "salt.utils.thin.looseversion", + type("looseversion", (), {"__file__": "/site-packages/looseversion"}), + ) @patch_if( salt.utils.thin.has_immutables, "salt.utils.thin.immutables", @@ -462,6 +472,8 @@ class SSHThinTestCase(TestCase): "backports_abc", "concurrent", "contextvars", + "looseversion", + "packaging", ] if salt.utils.thin.has_immutables: base_tops.extend(["immutables"]) @@ -531,6 +543,14 @@ class SSHThinTestCase(TestCase): "salt.utils.thin.py_contextvars", type("contextvars", (), {"__file__": "/site-packages/contextvars"}), ) + @patch( + "salt.utils.thin.packaging", + type("packaging", (), {"__file__": "/site-packages/packaging"}), + ) + @patch( + "salt.utils.thin.looseversion", + type("looseversion", (), {"__file__": "/site-packages/looseversion"}), + ) @patch_if( salt.utils.thin.has_immutables, "salt.utils.thin.immutables", @@ -557,6 +577,8 @@ class SSHThinTestCase(TestCase): "markupsafe", "backports_abc", "contextvars", + "looseversion", + "packaging", "foo", "bar.py", ] @@ -636,6 +658,14 @@ class SSHThinTestCase(TestCase): "salt.utils.thin.py_contextvars", type("contextvars", (), {"__file__": "/site-packages/contextvars"}), ) + @patch( + "salt.utils.thin.packaging", + type("packaging", (), {"__file__": "/site-packages/packaging"}), + ) + @patch( + "salt.utils.thin.looseversion", + type("looseversion", (), {"__file__": "/site-packages/looseversion"}), + ) @patch_if( salt.utils.thin.has_immutables, "salt.utils.thin.immutables", @@ -662,6 +692,8 @@ class SSHThinTestCase(TestCase): "markupsafe", "backports_abc", "contextvars", + "looseversion", + "packaging", "foo.so", "bar.so", ] @@ -1098,6 +1130,8 @@ class SSHThinTestCase(TestCase): (bts(""), bts("")), (bts(""), bts("")), (bts(""), bts("")), + (bts("looseversion.py"), bts("")), + (bts("packaging/__init__.py"), bts("")), (bts("distro.py"), bts("")), ], ), @@ -1138,6 +1172,8 @@ class SSHThinTestCase(TestCase): (bts(""), bts("")), (bts(""), bts("")), (bts(""), bts("")), + (bts("looseversion.py"), bts("")), + (bts("packaging/__init__.py"), bts("")), (bts("distro.py"), bts("")), ], ), @@ -1181,6 +1217,8 @@ class SSHThinTestCase(TestCase): (bts(""), bts("")), (bts(""), bts("")), (bts(""), bts("")), + (bts("looseversion.py"), bts("")), + (bts("packaging/__init__.py"), bts("")), ], ), )