Move project_id into calls
This commit is contained in:
Родитель
10ae4c77fe
Коммит
31ef41edea
|
@ -9,10 +9,10 @@
|
||||||
"**/.pytest_cache/**": true,
|
"**/.pytest_cache/**": true,
|
||||||
"**/.mypy_cache/**": true
|
"**/.mypy_cache/**": true
|
||||||
},
|
},
|
||||||
"python.pythonPath": "${workspaceFolder}/bin/python3",
|
"python.pythonPath": "venv/bin/python",
|
||||||
"python.linting.enabled": true,
|
"python.linting.enabled": true,
|
||||||
"python.linting.pylintEnabled": true,
|
"python.linting.pylintEnabled": true,
|
||||||
"python.linting.pylintPath": "${workspaceFolder}/bin/pylint",
|
"python.linting.pylintPath": "${workspaceFolder}/venv/bin/pylint",
|
||||||
"python.linting.pylintArgs": [
|
"python.linting.pylintArgs": [
|
||||||
"--rcfile=${workspaceFolder}/pylintrc",
|
"--rcfile=${workspaceFolder}/pylintrc",
|
||||||
"--extension-pkg-whitelist=mypy",
|
"--extension-pkg-whitelist=mypy",
|
||||||
|
@ -20,14 +20,14 @@
|
||||||
"import sys; sys.path.insert(0, '${workspaceFolder}/simple_ado')"
|
"import sys; sys.path.insert(0, '${workspaceFolder}/simple_ado')"
|
||||||
],
|
],
|
||||||
"python.linting.mypyEnabled": true,
|
"python.linting.mypyEnabled": true,
|
||||||
"python.linting.mypyPath": "${workspaceFolder}/bin/mypy",
|
"python.linting.mypyPath": "${workspaceFolder}/venv/bin/mypy",
|
||||||
"python.linting.mypyArgs": [
|
"python.linting.mypyArgs": [
|
||||||
"--config-file=${workspaceFolder}/mypy.ini"
|
"--config-file=${workspaceFolder}/mypy.ini"
|
||||||
],
|
],
|
||||||
"python.jediEnabled": true,
|
"python.jediEnabled": true,
|
||||||
"editor.formatOnSave": true,
|
"editor.formatOnSave": true,
|
||||||
"python.formatting.provider": "black",
|
"python.formatting.provider": "black",
|
||||||
"python.formatting.blackPath": "${workspaceFolder}/bin/black",
|
"python.formatting.blackPath": "${workspaceFolder}/venv/bin/black",
|
||||||
"python.formatting.blackArgs": [
|
"python.formatting.blackArgs": [
|
||||||
"--line-length",
|
"--line-length",
|
||||||
"100"
|
"100"
|
||||||
|
|
|
@ -1,44 +1,40 @@
|
||||||
[[package]]
|
[[package]]
|
||||||
category = "dev"
|
|
||||||
description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"."
|
|
||||||
name = "appdirs"
|
name = "appdirs"
|
||||||
|
version = "1.4.4"
|
||||||
|
description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"."
|
||||||
|
category = "dev"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = "*"
|
python-versions = "*"
|
||||||
version = "1.4.4"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
category = "dev"
|
|
||||||
description = "An abstract syntax tree for Python with inference support."
|
|
||||||
name = "astroid"
|
name = "astroid"
|
||||||
|
version = "2.3.3"
|
||||||
|
description = "An abstract syntax tree for Python with inference support."
|
||||||
|
category = "dev"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.5.*"
|
python-versions = ">=3.5.*"
|
||||||
version = "2.3.3"
|
|
||||||
|
|
||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
lazy-object-proxy = ">=1.4.0,<1.5.0"
|
lazy-object-proxy = ">=1.4.0,<1.5.0"
|
||||||
six = ">=1.12,<2.0"
|
six = ">=1.12,<2.0"
|
||||||
|
typed-ast = {version = ">=1.4.0,<1.5", markers = "implementation_name == \"cpython\" and python_version < \"3.8\""}
|
||||||
wrapt = ">=1.11.0,<1.12.0"
|
wrapt = ">=1.11.0,<1.12.0"
|
||||||
|
|
||||||
[package.dependencies.typed-ast]
|
|
||||||
python = "<3.8"
|
|
||||||
version = ">=1.4.0,<1.5"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
category = "dev"
|
|
||||||
description = "Atomic file writes."
|
|
||||||
marker = "sys_platform == \"win32\""
|
|
||||||
name = "atomicwrites"
|
name = "atomicwrites"
|
||||||
|
version = "1.4.0"
|
||||||
|
description = "Atomic file writes."
|
||||||
|
category = "dev"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
|
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
|
||||||
version = "1.4.0"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
category = "dev"
|
|
||||||
description = "Classes Without Boilerplate"
|
|
||||||
name = "attrs"
|
name = "attrs"
|
||||||
|
version = "19.1.0"
|
||||||
|
description = "Classes Without Boilerplate"
|
||||||
|
category = "dev"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
|
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
|
||||||
version = "19.1.0"
|
|
||||||
|
|
||||||
[package.extras]
|
[package.extras]
|
||||||
dev = ["coverage", "hypothesis", "pympler", "pytest", "six", "zope.interface", "sphinx", "pre-commit"]
|
dev = ["coverage", "hypothesis", "pympler", "pytest", "six", "zope.interface", "sphinx", "pre-commit"]
|
||||||
|
@ -46,12 +42,12 @@ docs = ["sphinx", "zope.interface"]
|
||||||
tests = ["coverage", "hypothesis", "pympler", "pytest", "six", "zope.interface"]
|
tests = ["coverage", "hypothesis", "pympler", "pytest", "six", "zope.interface"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
category = "dev"
|
|
||||||
description = "The uncompromising code formatter."
|
|
||||||
name = "black"
|
name = "black"
|
||||||
|
version = "19.10b0"
|
||||||
|
description = "The uncompromising code formatter."
|
||||||
|
category = "dev"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.6"
|
python-versions = ">=3.6"
|
||||||
version = "19.10b0"
|
|
||||||
|
|
||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
appdirs = "*"
|
appdirs = "*"
|
||||||
|
@ -66,88 +62,86 @@ typed-ast = ">=1.4.0"
|
||||||
d = ["aiohttp (>=3.3.2)", "aiohttp-cors"]
|
d = ["aiohttp (>=3.3.2)", "aiohttp-cors"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
category = "main"
|
|
||||||
description = "Python package for providing Mozilla's CA Bundle."
|
|
||||||
name = "certifi"
|
name = "certifi"
|
||||||
optional = false
|
version = "2020.6.20"
|
||||||
python-versions = "*"
|
description = "Python package for providing Mozilla's CA Bundle."
|
||||||
version = "2020.4.5.1"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
category = "main"
|
category = "main"
|
||||||
description = "Universal encoding detector for Python 2 and 3"
|
|
||||||
name = "chardet"
|
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = "*"
|
python-versions = "*"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "chardet"
|
||||||
version = "3.0.4"
|
version = "3.0.4"
|
||||||
|
description = "Universal encoding detector for Python 2 and 3"
|
||||||
|
category = "main"
|
||||||
|
optional = false
|
||||||
|
python-versions = "*"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
category = "dev"
|
|
||||||
description = "Composable command line interface toolkit"
|
|
||||||
name = "click"
|
name = "click"
|
||||||
optional = false
|
|
||||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
|
|
||||||
version = "7.1.2"
|
version = "7.1.2"
|
||||||
|
description = "Composable command line interface toolkit"
|
||||||
[[package]]
|
|
||||||
category = "dev"
|
category = "dev"
|
||||||
description = "Cross-platform colored terminal text."
|
|
||||||
marker = "sys_platform == \"win32\""
|
|
||||||
name = "colorama"
|
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
|
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
|
||||||
version = "0.4.3"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
name = "colorama"
|
||||||
|
version = "0.4.4"
|
||||||
|
description = "Cross-platform colored terminal text."
|
||||||
category = "dev"
|
category = "dev"
|
||||||
description = "Code coverage measurement for Python"
|
optional = false
|
||||||
|
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
name = "coverage"
|
name = "coverage"
|
||||||
|
version = "5.3"
|
||||||
|
description = "Code coverage measurement for Python"
|
||||||
|
category = "dev"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4"
|
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4"
|
||||||
version = "5.1"
|
|
||||||
|
|
||||||
[package.extras]
|
[package.extras]
|
||||||
toml = ["toml"]
|
toml = ["toml"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
category = "main"
|
|
||||||
description = "A library to make deserialization easy."
|
|
||||||
name = "deserialize"
|
name = "deserialize"
|
||||||
|
version = "1.8.0"
|
||||||
|
description = "A library to make deserialization easy."
|
||||||
|
category = "main"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.6,<4.0"
|
python-versions = ">=3.6,<4.0"
|
||||||
version = "1.5.1"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
category = "main"
|
|
||||||
description = "Internationalized Domain Names in Applications (IDNA)"
|
|
||||||
name = "idna"
|
name = "idna"
|
||||||
|
version = "2.10"
|
||||||
|
description = "Internationalized Domain Names in Applications (IDNA)"
|
||||||
|
category = "main"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
|
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
|
||||||
version = "2.9"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
category = "dev"
|
|
||||||
description = "Read metadata from Python packages"
|
|
||||||
marker = "python_version < \"3.8\""
|
|
||||||
name = "importlib-metadata"
|
name = "importlib-metadata"
|
||||||
|
version = "2.0.0"
|
||||||
|
description = "Read metadata from Python packages"
|
||||||
|
category = "dev"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7"
|
python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7"
|
||||||
version = "1.6.0"
|
|
||||||
|
|
||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
zipp = ">=0.5"
|
zipp = ">=0.5"
|
||||||
|
|
||||||
[package.extras]
|
[package.extras]
|
||||||
docs = ["sphinx", "rst.linker"]
|
docs = ["sphinx", "rst.linker"]
|
||||||
testing = ["packaging", "importlib-resources"]
|
testing = ["packaging", "pep517", "importlib-resources (>=1.3)"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
category = "dev"
|
|
||||||
description = "A Python utility / library to sort Python imports."
|
|
||||||
name = "isort"
|
name = "isort"
|
||||||
|
version = "4.3.21"
|
||||||
|
description = "A Python utility / library to sort Python imports."
|
||||||
|
category = "dev"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
|
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
|
||||||
version = "4.3.21"
|
|
||||||
|
|
||||||
[package.extras]
|
[package.extras]
|
||||||
pipfile = ["pipreqs", "requirementslib"]
|
pipfile = ["pipreqs", "requirementslib"]
|
||||||
|
@ -156,36 +150,36 @@ requirements = ["pipreqs", "pip-api"]
|
||||||
xdg_home = ["appdirs (>=1.4.0)"]
|
xdg_home = ["appdirs (>=1.4.0)"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
category = "dev"
|
|
||||||
description = "A fast and thorough lazy object proxy."
|
|
||||||
name = "lazy-object-proxy"
|
name = "lazy-object-proxy"
|
||||||
|
version = "1.4.3"
|
||||||
|
description = "A fast and thorough lazy object proxy."
|
||||||
|
category = "dev"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
|
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
|
||||||
version = "1.4.3"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
category = "dev"
|
|
||||||
description = "McCabe checker, plugin for flake8"
|
|
||||||
name = "mccabe"
|
name = "mccabe"
|
||||||
|
version = "0.6.1"
|
||||||
|
description = "McCabe checker, plugin for flake8"
|
||||||
|
category = "dev"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = "*"
|
python-versions = "*"
|
||||||
version = "0.6.1"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
category = "dev"
|
|
||||||
description = "More routines for operating on iterables, beyond itertools"
|
|
||||||
name = "more-itertools"
|
name = "more-itertools"
|
||||||
|
version = "8.5.0"
|
||||||
|
description = "More routines for operating on iterables, beyond itertools"
|
||||||
|
category = "dev"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.5"
|
python-versions = ">=3.5"
|
||||||
version = "8.3.0"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
category = "dev"
|
|
||||||
description = "Optional static typing for Python"
|
|
||||||
name = "mypy"
|
name = "mypy"
|
||||||
|
version = "0.770"
|
||||||
|
description = "Optional static typing for Python"
|
||||||
|
category = "dev"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.5"
|
python-versions = ">=3.5"
|
||||||
version = "0.770"
|
|
||||||
|
|
||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
mypy-extensions = ">=0.4.3,<0.5.0"
|
mypy-extensions = ">=0.4.3,<0.5.0"
|
||||||
|
@ -196,112 +190,107 @@ typing-extensions = ">=3.7.4"
|
||||||
dmypy = ["psutil (>=4.0)"]
|
dmypy = ["psutil (>=4.0)"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
category = "dev"
|
|
||||||
description = "Experimental type system extensions for programs checked with the mypy typechecker."
|
|
||||||
name = "mypy-extensions"
|
name = "mypy-extensions"
|
||||||
|
version = "0.4.3"
|
||||||
|
description = "Experimental type system extensions for programs checked with the mypy typechecker."
|
||||||
|
category = "dev"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = "*"
|
python-versions = "*"
|
||||||
version = "0.4.3"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
category = "dev"
|
|
||||||
description = "Core utilities for Python packages"
|
|
||||||
name = "packaging"
|
name = "packaging"
|
||||||
|
version = "20.4"
|
||||||
|
description = "Core utilities for Python packages"
|
||||||
|
category = "dev"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
|
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
|
||||||
version = "20.4"
|
|
||||||
|
|
||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
pyparsing = ">=2.0.2"
|
pyparsing = ">=2.0.2"
|
||||||
six = "*"
|
six = "*"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
category = "dev"
|
|
||||||
description = "Utility library for gitignore style pattern matching of file paths."
|
|
||||||
name = "pathspec"
|
name = "pathspec"
|
||||||
|
version = "0.8.0"
|
||||||
|
description = "Utility library for gitignore style pattern matching of file paths."
|
||||||
|
category = "dev"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
|
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
|
||||||
version = "0.8.0"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
category = "dev"
|
|
||||||
description = "plugin and hook calling mechanisms for python"
|
|
||||||
name = "pluggy"
|
name = "pluggy"
|
||||||
|
version = "0.13.1"
|
||||||
|
description = "plugin and hook calling mechanisms for python"
|
||||||
|
category = "dev"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
|
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
|
||||||
version = "0.13.1"
|
|
||||||
|
|
||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
[package.dependencies.importlib-metadata]
|
importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""}
|
||||||
python = "<3.8"
|
|
||||||
version = ">=0.12"
|
|
||||||
|
|
||||||
[package.extras]
|
[package.extras]
|
||||||
dev = ["pre-commit", "tox"]
|
dev = ["pre-commit", "tox"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
category = "dev"
|
|
||||||
description = "library with cross-python path, ini-parsing, io, code, log facilities"
|
|
||||||
name = "py"
|
name = "py"
|
||||||
|
version = "1.9.0"
|
||||||
|
description = "library with cross-python path, ini-parsing, io, code, log facilities"
|
||||||
|
category = "dev"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
|
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
|
||||||
version = "1.8.1"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
category = "dev"
|
|
||||||
description = "python code static checker"
|
|
||||||
name = "pylint"
|
name = "pylint"
|
||||||
|
version = "2.4.4"
|
||||||
|
description = "python code static checker"
|
||||||
|
category = "dev"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.5.*"
|
python-versions = ">=3.5.*"
|
||||||
version = "2.4.4"
|
|
||||||
|
|
||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
astroid = ">=2.3.0,<2.4"
|
astroid = ">=2.3.0,<2.4"
|
||||||
colorama = "*"
|
colorama = {version = "*", markers = "sys_platform == \"win32\""}
|
||||||
isort = ">=4.2.5,<5"
|
isort = ">=4.2.5,<5"
|
||||||
mccabe = ">=0.6,<0.7"
|
mccabe = ">=0.6,<0.7"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
category = "dev"
|
|
||||||
description = "Python parsing module"
|
|
||||||
name = "pyparsing"
|
name = "pyparsing"
|
||||||
|
version = "2.4.7"
|
||||||
|
description = "Python parsing module"
|
||||||
|
category = "dev"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
|
python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
|
||||||
version = "2.4.7"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
category = "dev"
|
|
||||||
description = "pytest: simple powerful testing with Python"
|
|
||||||
name = "pytest"
|
name = "pytest"
|
||||||
|
version = "5.4.1"
|
||||||
|
description = "pytest: simple powerful testing with Python"
|
||||||
|
category = "dev"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.5"
|
python-versions = ">=3.5"
|
||||||
version = "5.4.1"
|
|
||||||
|
|
||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
atomicwrites = ">=1.0"
|
atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""}
|
||||||
attrs = ">=17.4.0"
|
attrs = ">=17.4.0"
|
||||||
colorama = "*"
|
colorama = {version = "*", markers = "sys_platform == \"win32\""}
|
||||||
|
importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""}
|
||||||
more-itertools = ">=4.0.0"
|
more-itertools = ">=4.0.0"
|
||||||
packaging = "*"
|
packaging = "*"
|
||||||
pluggy = ">=0.12,<1.0"
|
pluggy = ">=0.12,<1.0"
|
||||||
py = ">=1.5.0"
|
py = ">=1.5.0"
|
||||||
wcwidth = "*"
|
wcwidth = "*"
|
||||||
|
|
||||||
[package.dependencies.importlib-metadata]
|
|
||||||
python = "<3.8"
|
|
||||||
version = ">=0.12"
|
|
||||||
|
|
||||||
[package.extras]
|
[package.extras]
|
||||||
checkqa-mypy = ["mypy (v0.761)"]
|
checkqa-mypy = ["mypy (v0.761)"]
|
||||||
testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"]
|
testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
category = "dev"
|
|
||||||
description = "Pytest plugin for measuring coverage."
|
|
||||||
name = "pytest-cov"
|
name = "pytest-cov"
|
||||||
|
version = "2.8.1"
|
||||||
|
description = "Pytest plugin for measuring coverage."
|
||||||
|
category = "dev"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
|
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
|
||||||
version = "2.8.1"
|
|
||||||
|
|
||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
coverage = ">=4.4"
|
coverage = ">=4.4"
|
||||||
|
@ -311,20 +300,20 @@ pytest = ">=3.6"
|
||||||
testing = ["fields", "hunter", "process-tests (2.0.2)", "six", "virtualenv"]
|
testing = ["fields", "hunter", "process-tests (2.0.2)", "six", "virtualenv"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
category = "dev"
|
|
||||||
description = "Alternative regular expression module, to replace re."
|
|
||||||
name = "regex"
|
name = "regex"
|
||||||
|
version = "2020.10.11"
|
||||||
|
description = "Alternative regular expression module, to replace re."
|
||||||
|
category = "dev"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = "*"
|
python-versions = "*"
|
||||||
version = "2020.5.14"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
category = "main"
|
|
||||||
description = "Python HTTP for Humans."
|
|
||||||
name = "requests"
|
name = "requests"
|
||||||
|
version = "2.24.0"
|
||||||
|
description = "Python HTTP for Humans."
|
||||||
|
category = "main"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
|
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
|
||||||
version = "2.23.0"
|
|
||||||
|
|
||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
certifi = ">=2017.4.17"
|
certifi = ">=2017.4.17"
|
||||||
|
@ -337,20 +326,20 @@ security = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)"]
|
||||||
socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7)", "win-inet-pton"]
|
socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7)", "win-inet-pton"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
category = "main"
|
|
||||||
description = "Python 2 and 3 compatibility utilities"
|
|
||||||
name = "six"
|
name = "six"
|
||||||
|
version = "1.15.0"
|
||||||
|
description = "Python 2 and 3 compatibility utilities"
|
||||||
|
category = "main"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
|
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
|
||||||
version = "1.14.0"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
category = "main"
|
|
||||||
description = "Retry code until it succeeds"
|
|
||||||
name = "tenacity"
|
name = "tenacity"
|
||||||
|
version = "6.2.0"
|
||||||
|
description = "Retry code until it succeeds"
|
||||||
|
category = "main"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = "*"
|
python-versions = "*"
|
||||||
version = "6.2.0"
|
|
||||||
|
|
||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
six = ">=1.9.0"
|
six = ">=1.9.0"
|
||||||
|
@ -359,36 +348,36 @@ six = ">=1.9.0"
|
||||||
doc = ["reno", "sphinx", "tornado (>=4.5)"]
|
doc = ["reno", "sphinx", "tornado (>=4.5)"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
category = "dev"
|
|
||||||
description = "Python Library for Tom's Obvious, Minimal Language"
|
|
||||||
name = "toml"
|
name = "toml"
|
||||||
optional = false
|
|
||||||
python-versions = "*"
|
|
||||||
version = "0.10.1"
|
version = "0.10.1"
|
||||||
|
description = "Python Library for Tom's Obvious, Minimal Language"
|
||||||
|
category = "dev"
|
||||||
|
optional = false
|
||||||
|
python-versions = "*"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
category = "dev"
|
|
||||||
description = "a fork of Python 2 and 3 ast modules with type comment support"
|
|
||||||
name = "typed-ast"
|
name = "typed-ast"
|
||||||
optional = false
|
|
||||||
python-versions = "*"
|
|
||||||
version = "1.4.1"
|
version = "1.4.1"
|
||||||
|
description = "a fork of Python 2 and 3 ast modules with type comment support"
|
||||||
[[package]]
|
category = "dev"
|
||||||
|
optional = false
|
||||||
|
python-versions = "*"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "typing-extensions"
|
||||||
|
version = "3.7.4.3"
|
||||||
|
description = "Backported and Experimental Type Hints for Python 3.5+"
|
||||||
category = "dev"
|
category = "dev"
|
||||||
description = "Backported and Experimental Type Hints for Python 3.5+"
|
|
||||||
name = "typing-extensions"
|
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = "*"
|
python-versions = "*"
|
||||||
version = "3.7.4.2"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
category = "main"
|
|
||||||
description = "HTTP library with thread-safe connection pooling, file post, and more."
|
|
||||||
name = "urllib3"
|
name = "urllib3"
|
||||||
|
version = "1.25.10"
|
||||||
|
description = "HTTP library with thread-safe connection pooling, file post, and more."
|
||||||
|
category = "main"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4"
|
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4"
|
||||||
version = "1.25.9"
|
|
||||||
|
|
||||||
[package.extras]
|
[package.extras]
|
||||||
brotli = ["brotlipy (>=0.6.0)"]
|
brotli = ["brotlipy (>=0.6.0)"]
|
||||||
|
@ -396,37 +385,37 @@ secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "pyOpenSSL (>=0
|
||||||
socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7,<2.0)"]
|
socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7,<2.0)"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
category = "dev"
|
|
||||||
description = "Measures number of Terminal column cells of wide-character codes"
|
|
||||||
name = "wcwidth"
|
name = "wcwidth"
|
||||||
|
version = "0.2.5"
|
||||||
|
description = "Measures the displayed width of unicode strings in a terminal"
|
||||||
|
category = "dev"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = "*"
|
python-versions = "*"
|
||||||
version = "0.1.9"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
category = "dev"
|
|
||||||
description = "Module for decorators, wrappers and monkey patching."
|
|
||||||
name = "wrapt"
|
name = "wrapt"
|
||||||
|
version = "1.11.2"
|
||||||
|
description = "Module for decorators, wrappers and monkey patching."
|
||||||
|
category = "dev"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = "*"
|
python-versions = "*"
|
||||||
version = "1.11.2"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
category = "dev"
|
|
||||||
description = "Backport of pathlib-compatible object wrapper for zip files"
|
|
||||||
marker = "python_version < \"3.8\""
|
|
||||||
name = "zipp"
|
name = "zipp"
|
||||||
|
version = "3.3.0"
|
||||||
|
description = "Backport of pathlib-compatible object wrapper for zip files"
|
||||||
|
category = "dev"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.6"
|
python-versions = ">=3.6"
|
||||||
version = "3.1.0"
|
|
||||||
|
|
||||||
[package.extras]
|
[package.extras]
|
||||||
docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"]
|
docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"]
|
||||||
testing = ["jaraco.itertools", "func-timeout"]
|
testing = ["pytest (>=3.5,<3.7.3 || >3.7.3)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "jaraco.test (>=3.2.0)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"]
|
||||||
|
|
||||||
[metadata]
|
[metadata]
|
||||||
content-hash = "0fd8d66a0d3ac1f96b686f5077788b9b219c7c6ac1885a6d049607f417c1f90e"
|
lock-version = "1.1"
|
||||||
python-versions = "^3.6"
|
python-versions = "^3.6"
|
||||||
|
content-hash = "0fd8d66a0d3ac1f96b686f5077788b9b219c7c6ac1885a6d049607f417c1f90e"
|
||||||
|
|
||||||
[metadata.files]
|
[metadata.files]
|
||||||
appdirs = [
|
appdirs = [
|
||||||
|
@ -450,8 +439,8 @@ black = [
|
||||||
{file = "black-19.10b0.tar.gz", hash = "sha256:c2edb73a08e9e0e6f65a0e6af18b059b8b1cdd5bef997d7a0b181df93dc81539"},
|
{file = "black-19.10b0.tar.gz", hash = "sha256:c2edb73a08e9e0e6f65a0e6af18b059b8b1cdd5bef997d7a0b181df93dc81539"},
|
||||||
]
|
]
|
||||||
certifi = [
|
certifi = [
|
||||||
{file = "certifi-2020.4.5.1-py2.py3-none-any.whl", hash = "sha256:1d987a998c75633c40847cc966fcf5904906c920a7f17ef374f5aa4282abd304"},
|
{file = "certifi-2020.6.20-py2.py3-none-any.whl", hash = "sha256:8fc0819f1f30ba15bdb34cceffb9ef04d99f420f68eb75d901e9560b8749fc41"},
|
||||||
{file = "certifi-2020.4.5.1.tar.gz", hash = "sha256:51fcb31174be6e6664c5f69e3e1691a2d72a1a12e90f872cbdb1567eb47b6519"},
|
{file = "certifi-2020.6.20.tar.gz", hash = "sha256:5930595817496dd21bb8dc35dad090f1c2cd0adfaf21204bf6732ca5d8ee34d3"},
|
||||||
]
|
]
|
||||||
chardet = [
|
chardet = [
|
||||||
{file = "chardet-3.0.4-py2.py3-none-any.whl", hash = "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"},
|
{file = "chardet-3.0.4-py2.py3-none-any.whl", hash = "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"},
|
||||||
|
@ -462,53 +451,55 @@ click = [
|
||||||
{file = "click-7.1.2.tar.gz", hash = "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a"},
|
{file = "click-7.1.2.tar.gz", hash = "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a"},
|
||||||
]
|
]
|
||||||
colorama = [
|
colorama = [
|
||||||
{file = "colorama-0.4.3-py2.py3-none-any.whl", hash = "sha256:7d73d2a99753107a36ac6b455ee49046802e59d9d076ef8e47b61499fa29afff"},
|
{file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"},
|
||||||
{file = "colorama-0.4.3.tar.gz", hash = "sha256:e96da0d330793e2cb9485e9ddfd918d456036c7149416295932478192f4436a1"},
|
|
||||||
]
|
]
|
||||||
coverage = [
|
coverage = [
|
||||||
{file = "coverage-5.1-cp27-cp27m-macosx_10_12_x86_64.whl", hash = "sha256:0cb4be7e784dcdc050fc58ef05b71aa8e89b7e6636b99967fadbdba694cf2b65"},
|
{file = "coverage-5.3-cp27-cp27m-macosx_10_13_intel.whl", hash = "sha256:bd3166bb3b111e76a4f8e2980fa1addf2920a4ca9b2b8ca36a3bc3dedc618270"},
|
||||||
{file = "coverage-5.1-cp27-cp27m-macosx_10_13_intel.whl", hash = "sha256:c317eaf5ff46a34305b202e73404f55f7389ef834b8dbf4da09b9b9b37f76dd2"},
|
{file = "coverage-5.3-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:9342dd70a1e151684727c9c91ea003b2fb33523bf19385d4554f7897ca0141d4"},
|
||||||
{file = "coverage-5.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:b83835506dfc185a319031cf853fa4bb1b3974b1f913f5bb1a0f3d98bdcded04"},
|
{file = "coverage-5.3-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:63808c30b41f3bbf65e29f7280bf793c79f54fb807057de7e5238ffc7cc4d7b9"},
|
||||||
{file = "coverage-5.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5f2294dbf7875b991c381e3d5af2bcc3494d836affa52b809c91697449d0eda6"},
|
{file = "coverage-5.3-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:4d6a42744139a7fa5b46a264874a781e8694bb32f1d76d8137b68138686f1729"},
|
||||||
{file = "coverage-5.1-cp27-cp27m-win32.whl", hash = "sha256:de807ae933cfb7f0c7d9d981a053772452217df2bf38e7e6267c9cbf9545a796"},
|
{file = "coverage-5.3-cp27-cp27m-win32.whl", hash = "sha256:86e9f8cd4b0cdd57b4ae71a9c186717daa4c5a99f3238a8723f416256e0b064d"},
|
||||||
{file = "coverage-5.1-cp27-cp27m-win_amd64.whl", hash = "sha256:bf9cb9a9fd8891e7efd2d44deb24b86d647394b9705b744ff6f8261e6f29a730"},
|
{file = "coverage-5.3-cp27-cp27m-win_amd64.whl", hash = "sha256:7858847f2d84bf6e64c7f66498e851c54de8ea06a6f96a32a1d192d846734418"},
|
||||||
{file = "coverage-5.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:acf3763ed01af8410fc36afea23707d4ea58ba7e86a8ee915dfb9ceff9ef69d0"},
|
{file = "coverage-5.3-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:530cc8aaf11cc2ac7430f3614b04645662ef20c348dce4167c22d99bec3480e9"},
|
||||||
{file = "coverage-5.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:dec5202bfe6f672d4511086e125db035a52b00f1648d6407cc8e526912c0353a"},
|
{file = "coverage-5.3-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:381ead10b9b9af5f64646cd27107fb27b614ee7040bb1226f9c07ba96625cbb5"},
|
||||||
{file = "coverage-5.1-cp35-cp35m-macosx_10_12_x86_64.whl", hash = "sha256:7a5bdad4edec57b5fb8dae7d3ee58622d626fd3a0be0dfceda162a7035885ecf"},
|
{file = "coverage-5.3-cp35-cp35m-macosx_10_13_x86_64.whl", hash = "sha256:71b69bd716698fa62cd97137d6f2fdf49f534decb23a2c6fc80813e8b7be6822"},
|
||||||
{file = "coverage-5.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:1601e480b9b99697a570cea7ef749e88123c04b92d84cedaa01e117436b4a0a9"},
|
{file = "coverage-5.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:1d44bb3a652fed01f1f2c10d5477956116e9b391320c94d36c6bf13b088a1097"},
|
||||||
{file = "coverage-5.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:dbe8c6ae7534b5b024296464f387d57c13caa942f6d8e6e0346f27e509f0f768"},
|
{file = "coverage-5.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:1c6703094c81fa55b816f5ae542c6ffc625fec769f22b053adb42ad712d086c9"},
|
||||||
{file = "coverage-5.1-cp35-cp35m-win32.whl", hash = "sha256:a027ef0492ede1e03a8054e3c37b8def89a1e3c471482e9f046906ba4f2aafd2"},
|
{file = "coverage-5.3-cp35-cp35m-win32.whl", hash = "sha256:cedb2f9e1f990918ea061f28a0f0077a07702e3819602d3507e2ff98c8d20636"},
|
||||||
{file = "coverage-5.1-cp35-cp35m-win_amd64.whl", hash = "sha256:0e61d9803d5851849c24f78227939c701ced6704f337cad0a91e0972c51c1ee7"},
|
{file = "coverage-5.3-cp35-cp35m-win_amd64.whl", hash = "sha256:7f43286f13d91a34fadf61ae252a51a130223c52bfefb50310d5b2deb062cf0f"},
|
||||||
{file = "coverage-5.1-cp36-cp36m-macosx_10_13_x86_64.whl", hash = "sha256:2d27a3f742c98e5c6b461ee6ef7287400a1956c11421eb574d843d9ec1f772f0"},
|
{file = "coverage-5.3-cp36-cp36m-macosx_10_13_x86_64.whl", hash = "sha256:c851b35fc078389bc16b915a0a7c1d5923e12e2c5aeec58c52f4aa8085ac8237"},
|
||||||
{file = "coverage-5.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:66460ab1599d3cf894bb6baee8c684788819b71a5dc1e8fa2ecc152e5d752019"},
|
{file = "coverage-5.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:aac1ba0a253e17889550ddb1b60a2063f7474155465577caa2a3b131224cfd54"},
|
||||||
{file = "coverage-5.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:5c542d1e62eece33c306d66fe0a5c4f7f7b3c08fecc46ead86d7916684b36d6c"},
|
{file = "coverage-5.3-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:2b31f46bf7b31e6aa690d4c7a3d51bb262438c6dcb0d528adde446531d0d3bb7"},
|
||||||
{file = "coverage-5.1-cp36-cp36m-win32.whl", hash = "sha256:2742c7515b9eb368718cd091bad1a1b44135cc72468c731302b3d641895b83d1"},
|
{file = "coverage-5.3-cp36-cp36m-win32.whl", hash = "sha256:c5f17ad25d2c1286436761b462e22b5020d83316f8e8fcb5deb2b3151f8f1d3a"},
|
||||||
{file = "coverage-5.1-cp36-cp36m-win_amd64.whl", hash = "sha256:dead2ddede4c7ba6cb3a721870f5141c97dc7d85a079edb4bd8d88c3ad5b20c7"},
|
{file = "coverage-5.3-cp36-cp36m-win_amd64.whl", hash = "sha256:aef72eae10b5e3116bac6957de1df4d75909fc76d1499a53fb6387434b6bcd8d"},
|
||||||
{file = "coverage-5.1-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:01333e1bd22c59713ba8a79f088b3955946e293114479bbfc2e37d522be03355"},
|
{file = "coverage-5.3-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:e8caf961e1b1a945db76f1b5fa9c91498d15f545ac0ababbe575cfab185d3bd8"},
|
||||||
{file = "coverage-5.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:e1ea316102ea1e1770724db01998d1603ed921c54a86a2efcb03428d5417e489"},
|
{file = "coverage-5.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:29a6272fec10623fcbe158fdf9abc7a5fa032048ac1d8631f14b50fbfc10d17f"},
|
||||||
{file = "coverage-5.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:adeb4c5b608574a3d647011af36f7586811a2c1197c861aedb548dd2453b41cd"},
|
{file = "coverage-5.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:2d43af2be93ffbad25dd959899b5b809618a496926146ce98ee0b23683f8c51c"},
|
||||||
{file = "coverage-5.1-cp37-cp37m-win32.whl", hash = "sha256:782caea581a6e9ff75eccda79287daefd1d2631cc09d642b6ee2d6da21fc0a4e"},
|
{file = "coverage-5.3-cp37-cp37m-win32.whl", hash = "sha256:c3888a051226e676e383de03bf49eb633cd39fc829516e5334e69b8d81aae751"},
|
||||||
{file = "coverage-5.1-cp37-cp37m-win_amd64.whl", hash = "sha256:00f1d23f4336efc3b311ed0d807feb45098fc86dee1ca13b3d6768cdab187c8a"},
|
{file = "coverage-5.3-cp37-cp37m-win_amd64.whl", hash = "sha256:9669179786254a2e7e57f0ecf224e978471491d660aaca833f845b72a2df3709"},
|
||||||
{file = "coverage-5.1-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:402e1744733df483b93abbf209283898e9f0d67470707e3c7516d84f48524f55"},
|
{file = "coverage-5.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0203acd33d2298e19b57451ebb0bed0ab0c602e5cf5a818591b4918b1f97d516"},
|
||||||
{file = "coverage-5.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:a3f3654d5734a3ece152636aad89f58afc9213c6520062db3978239db122f03c"},
|
{file = "coverage-5.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:582ddfbe712025448206a5bc45855d16c2e491c2dd102ee9a2841418ac1c629f"},
|
||||||
{file = "coverage-5.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6402bd2fdedabbdb63a316308142597534ea8e1895f4e7d8bf7476c5e8751fef"},
|
{file = "coverage-5.3-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:0f313707cdecd5cd3e217fc68c78a960b616604b559e9ea60cc16795c4304259"},
|
||||||
{file = "coverage-5.1-cp38-cp38-win32.whl", hash = "sha256:8fa0cbc7ecad630e5b0f4f35b0f6ad419246b02bc750de7ac66db92667996d24"},
|
{file = "coverage-5.3-cp38-cp38-win32.whl", hash = "sha256:78e93cc3571fd928a39c0b26767c986188a4118edc67bc0695bc7a284da22e82"},
|
||||||
{file = "coverage-5.1-cp38-cp38-win_amd64.whl", hash = "sha256:79a3cfd6346ce6c13145731d39db47b7a7b859c0272f02cdb89a3bdcbae233a0"},
|
{file = "coverage-5.3-cp38-cp38-win_amd64.whl", hash = "sha256:8f264ba2701b8c9f815b272ad568d555ef98dfe1576802ab3149c3629a9f2221"},
|
||||||
{file = "coverage-5.1-cp39-cp39-win32.whl", hash = "sha256:a82b92b04a23d3c8a581fc049228bafde988abacba397d57ce95fe95e0338ab4"},
|
{file = "coverage-5.3-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:50691e744714856f03a86df3e2bff847c2acede4c191f9a1da38f088df342978"},
|
||||||
{file = "coverage-5.1-cp39-cp39-win_amd64.whl", hash = "sha256:bb28a7245de68bf29f6fb199545d072d1036a1917dca17a1e75bbb919e14ee8e"},
|
{file = "coverage-5.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:9361de40701666b034c59ad9e317bae95c973b9ff92513dd0eced11c6adf2e21"},
|
||||||
{file = "coverage-5.1.tar.gz", hash = "sha256:f90bfc4ad18450c80b024036eaf91e4a246ae287701aaa88eaebebf150868052"},
|
{file = "coverage-5.3-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:c1b78fb9700fc961f53386ad2fd86d87091e06ede5d118b8a50dea285a071c24"},
|
||||||
|
{file = "coverage-5.3-cp39-cp39-win32.whl", hash = "sha256:cb7df71de0af56000115eafd000b867d1261f786b5eebd88a0ca6360cccfaca7"},
|
||||||
|
{file = "coverage-5.3-cp39-cp39-win_amd64.whl", hash = "sha256:47a11bdbd8ada9b7ee628596f9d97fbd3851bd9999d398e9436bd67376dbece7"},
|
||||||
|
{file = "coverage-5.3.tar.gz", hash = "sha256:280baa8ec489c4f542f8940f9c4c2181f0306a8ee1a54eceba071a449fb870a0"},
|
||||||
]
|
]
|
||||||
deserialize = [
|
deserialize = [
|
||||||
{file = "deserialize-1.5.1-py3-none-any.whl", hash = "sha256:8125255f4aee969c3475e08d42bb858e0102e707c1dd4e5e62815088477922e4"},
|
{file = "deserialize-1.8.0-py3-none-any.whl", hash = "sha256:a238146aef832b546fe3ec3025c27724be124d734fccfa884235df5165c177ee"},
|
||||||
{file = "deserialize-1.5.1.tar.gz", hash = "sha256:b3f973f0c7196bff182fe3c21bd09e963e8444a48eb57c98df3f0856f312c68d"},
|
{file = "deserialize-1.8.0.tar.gz", hash = "sha256:a093bd86bf73c5fca8bb73f0e03fc9c06dfe1a14e9b8b34dbfc6c82b25ae52a1"},
|
||||||
]
|
]
|
||||||
idna = [
|
idna = [
|
||||||
{file = "idna-2.9-py2.py3-none-any.whl", hash = "sha256:a068a21ceac8a4d63dbfd964670474107f541babbd2250d61922f029858365fa"},
|
{file = "idna-2.10-py2.py3-none-any.whl", hash = "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"},
|
||||||
{file = "idna-2.9.tar.gz", hash = "sha256:7588d1c14ae4c77d74036e8c22ff447b26d0fde8f007354fd48a7814db15b7cb"},
|
{file = "idna-2.10.tar.gz", hash = "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6"},
|
||||||
]
|
]
|
||||||
importlib-metadata = [
|
importlib-metadata = [
|
||||||
{file = "importlib_metadata-1.6.0-py2.py3-none-any.whl", hash = "sha256:2a688cbaa90e0cc587f1df48bdc97a6eadccdcd9c35fb3f976a09e3b5016d90f"},
|
{file = "importlib_metadata-2.0.0-py2.py3-none-any.whl", hash = "sha256:cefa1a2f919b866c5beb7c9f7b0ebb4061f30a8a9bf16d609b000e2dfaceb9c3"},
|
||||||
{file = "importlib_metadata-1.6.0.tar.gz", hash = "sha256:34513a8a0c4962bc66d35b359558fd8a5e10cd472d37aec5f66858addef32c1e"},
|
{file = "importlib_metadata-2.0.0.tar.gz", hash = "sha256:77a540690e24b0305878c37ffd421785a6f7e53c8b5720d211b211de8d0e95da"},
|
||||||
]
|
]
|
||||||
isort = [
|
isort = [
|
||||||
{file = "isort-4.3.21-py2.py3-none-any.whl", hash = "sha256:6e811fcb295968434526407adb8796944f1988c5b65e8139058f2014cbe100fd"},
|
{file = "isort-4.3.21-py2.py3-none-any.whl", hash = "sha256:6e811fcb295968434526407adb8796944f1988c5b65e8139058f2014cbe100fd"},
|
||||||
|
@ -542,8 +533,8 @@ mccabe = [
|
||||||
{file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"},
|
{file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"},
|
||||||
]
|
]
|
||||||
more-itertools = [
|
more-itertools = [
|
||||||
{file = "more-itertools-8.3.0.tar.gz", hash = "sha256:558bb897a2232f5e4f8e2399089e35aecb746e1f9191b6584a151647e89267be"},
|
{file = "more-itertools-8.5.0.tar.gz", hash = "sha256:6f83822ae94818eae2612063a5101a7311e68ae8002005b5e05f03fd74a86a20"},
|
||||||
{file = "more_itertools-8.3.0-py3-none-any.whl", hash = "sha256:7818f596b1e87be009031c7653d01acc46ed422e6656b394b0f765ce66ed4982"},
|
{file = "more_itertools-8.5.0-py3-none-any.whl", hash = "sha256:9b30f12df9393f0d28af9210ff8efe48d10c94f73e5daf886f10c4b0b0b4f03c"},
|
||||||
]
|
]
|
||||||
mypy = [
|
mypy = [
|
||||||
{file = "mypy-0.770-cp35-cp35m-macosx_10_6_x86_64.whl", hash = "sha256:a34b577cdf6313bf24755f7a0e3f3c326d5c1f4fe7422d1d06498eb25ad0c600"},
|
{file = "mypy-0.770-cp35-cp35m-macosx_10_6_x86_64.whl", hash = "sha256:a34b577cdf6313bf24755f7a0e3f3c326d5c1f4fe7422d1d06498eb25ad0c600"},
|
||||||
|
@ -578,8 +569,8 @@ pluggy = [
|
||||||
{file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"},
|
{file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"},
|
||||||
]
|
]
|
||||||
py = [
|
py = [
|
||||||
{file = "py-1.8.1-py2.py3-none-any.whl", hash = "sha256:c20fdd83a5dbc0af9efd622bee9a5564e278f6380fffcacc43ba6f43db2813b0"},
|
{file = "py-1.9.0-py2.py3-none-any.whl", hash = "sha256:366389d1db726cd2fcfc79732e75410e5fe4d31db13692115529d34069a043c2"},
|
||||||
{file = "py-1.8.1.tar.gz", hash = "sha256:5e27081401262157467ad6e7f851b7aa402c5852dbcb3dae06768434de5752aa"},
|
{file = "py-1.9.0.tar.gz", hash = "sha256:9ca6883ce56b4e8da7e79ac18787889fa5206c79dcc67fb065376cd2fe03f342"},
|
||||||
]
|
]
|
||||||
pylint = [
|
pylint = [
|
||||||
{file = "pylint-2.4.4-py3-none-any.whl", hash = "sha256:886e6afc935ea2590b462664b161ca9a5e40168ea99e5300935f6591ad467df4"},
|
{file = "pylint-2.4.4-py3-none-any.whl", hash = "sha256:886e6afc935ea2590b462664b161ca9a5e40168ea99e5300935f6591ad467df4"},
|
||||||
|
@ -598,35 +589,41 @@ pytest-cov = [
|
||||||
{file = "pytest_cov-2.8.1-py2.py3-none-any.whl", hash = "sha256:cdbdef4f870408ebdbfeb44e63e07eb18bb4619fae852f6e760645fa36172626"},
|
{file = "pytest_cov-2.8.1-py2.py3-none-any.whl", hash = "sha256:cdbdef4f870408ebdbfeb44e63e07eb18bb4619fae852f6e760645fa36172626"},
|
||||||
]
|
]
|
||||||
regex = [
|
regex = [
|
||||||
{file = "regex-2020.5.14-cp27-cp27m-win32.whl", hash = "sha256:e565569fc28e3ba3e475ec344d87ed3cd8ba2d575335359749298a0899fe122e"},
|
{file = "regex-2020.10.11-cp27-cp27m-win32.whl", hash = "sha256:4f5c0fe46fb79a7adf766b365cae56cafbf352c27358fda811e4a1dc8216d0db"},
|
||||||
{file = "regex-2020.5.14-cp27-cp27m-win_amd64.whl", hash = "sha256:d466967ac8e45244b9dfe302bbe5e3337f8dc4dec8d7d10f5e950d83b140d33a"},
|
{file = "regex-2020.10.11-cp27-cp27m-win_amd64.whl", hash = "sha256:39a5ef30bca911f5a8a3d4476f5713ed4d66e313d9fb6755b32bec8a2e519635"},
|
||||||
{file = "regex-2020.5.14-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:27ff7325b297fb6e5ebb70d10437592433601c423f5acf86e5bc1ee2919b9561"},
|
{file = "regex-2020.10.11-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:7c4fc5a8ec91a2254bb459db27dbd9e16bba1dabff638f425d736888d34aaefa"},
|
||||||
{file = "regex-2020.5.14-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:ea55b80eb0d1c3f1d8d784264a6764f931e172480a2f1868f2536444c5f01e01"},
|
{file = "regex-2020.10.11-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:d537e270b3e6bfaea4f49eaf267984bfb3628c86670e9ad2a257358d3b8f0955"},
|
||||||
{file = "regex-2020.5.14-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:c9bce6e006fbe771a02bda468ec40ffccbf954803b470a0345ad39c603402577"},
|
{file = "regex-2020.10.11-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:a8240df4957a5b0e641998a5d78b3c4ea762c845d8cb8997bf820626826fde9a"},
|
||||||
{file = "regex-2020.5.14-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:d881c2e657c51d89f02ae4c21d9adbef76b8325fe4d5cf0e9ad62f850f3a98fd"},
|
{file = "regex-2020.10.11-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:4302153abb96859beb2c778cc4662607a34175065fc2f33a21f49eb3fbd1ccd3"},
|
||||||
{file = "regex-2020.5.14-cp36-cp36m-win32.whl", hash = "sha256:99568f00f7bf820c620f01721485cad230f3fb28f57d8fbf4a7967ec2e446994"},
|
{file = "regex-2020.10.11-cp36-cp36m-win32.whl", hash = "sha256:c077c9d04a040dba001cf62b3aff08fd85be86bccf2c51a770c77377662a2d55"},
|
||||||
{file = "regex-2020.5.14-cp36-cp36m-win_amd64.whl", hash = "sha256:70c14743320a68c5dac7fc5a0f685be63bc2024b062fe2aaccc4acc3d01b14a1"},
|
{file = "regex-2020.10.11-cp36-cp36m-win_amd64.whl", hash = "sha256:46ab6070b0d2cb85700b8863b3f5504c7f75d8af44289e9562195fe02a8dd72d"},
|
||||||
{file = "regex-2020.5.14-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:a7c37f048ec3920783abab99f8f4036561a174f1314302ccfa4e9ad31cb00eb4"},
|
{file = "regex-2020.10.11-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:d629d750ebe75a88184db98f759633b0a7772c2e6f4da529f0027b4a402c0e2f"},
|
||||||
{file = "regex-2020.5.14-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:89d76ce33d3266173f5be80bd4efcbd5196cafc34100fdab814f9b228dee0fa4"},
|
{file = "regex-2020.10.11-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:8e7ef296b84d44425760fe813cabd7afbb48c8dd62023018b338bbd9d7d6f2f0"},
|
||||||
{file = "regex-2020.5.14-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:51f17abbe973c7673a61863516bdc9c0ef467407a940f39501e786a07406699c"},
|
{file = "regex-2020.10.11-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:e490f08897cb44e54bddf5c6e27deca9b58c4076849f32aaa7a0b9f1730f2c20"},
|
||||||
{file = "regex-2020.5.14-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:ce5cc53aa9fbbf6712e92c7cf268274eaff30f6bd12a0754e8133d85a8fb0f5f"},
|
{file = "regex-2020.10.11-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:850339226aa4fec04916386577674bb9d69abe0048f5d1a99f91b0004bfdcc01"},
|
||||||
{file = "regex-2020.5.14-cp37-cp37m-win32.whl", hash = "sha256:8044d1c085d49673aadb3d7dc20ef5cb5b030c7a4fa253a593dda2eab3059929"},
|
{file = "regex-2020.10.11-cp37-cp37m-win32.whl", hash = "sha256:60c4f64d9a326fe48e8738c3dbc068e1edc41ff7895a9e3723840deec4bc1c28"},
|
||||||
{file = "regex-2020.5.14-cp37-cp37m-win_amd64.whl", hash = "sha256:c2062c7d470751b648f1cacc3f54460aebfc261285f14bc6da49c6943bd48bdd"},
|
{file = "regex-2020.10.11-cp37-cp37m-win_amd64.whl", hash = "sha256:8ba3efdd60bfee1aa784dbcea175eb442d059b576934c9d099e381e5a9f48930"},
|
||||||
{file = "regex-2020.5.14-cp38-cp38-manylinux1_i686.whl", hash = "sha256:329ba35d711e3428db6b45a53b1b13a0a8ba07cbbcf10bbed291a7da45f106c3"},
|
{file = "regex-2020.10.11-cp38-cp38-manylinux1_i686.whl", hash = "sha256:2308491b3e6c530a3bb38a8a4bb1dc5fd32cbf1e11ca623f2172ba17a81acef1"},
|
||||||
{file = "regex-2020.5.14-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:579ea215c81d18da550b62ff97ee187b99f1b135fd894a13451e00986a080cad"},
|
{file = "regex-2020.10.11-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:b8806649983a1c78874ec7e04393ef076805740f6319e87a56f91f1767960212"},
|
||||||
{file = "regex-2020.5.14-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:3a9394197664e35566242686d84dfd264c07b20f93514e2e09d3c2b3ffdf78fe"},
|
{file = "regex-2020.10.11-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:a2a31ee8a354fa3036d12804730e1e20d58bc4e250365ead34b9c30bbe9908c3"},
|
||||||
{file = "regex-2020.5.14-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:ce367d21f33e23a84fb83a641b3834dd7dd8e9318ad8ff677fbfae5915a239f7"},
|
{file = "regex-2020.10.11-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:d9d53518eeed12190744d366ec4a3f39b99d7daa705abca95f87dd8b442df4ad"},
|
||||||
{file = "regex-2020.5.14-cp38-cp38-win32.whl", hash = "sha256:1386e75c9d1574f6aa2e4eb5355374c8e55f9aac97e224a8a5a6abded0f9c927"},
|
{file = "regex-2020.10.11-cp38-cp38-win32.whl", hash = "sha256:3d5a8d007116021cf65355ada47bf405656c4b3b9a988493d26688275fde1f1c"},
|
||||||
{file = "regex-2020.5.14-cp38-cp38-win_amd64.whl", hash = "sha256:7e61be8a2900897803c293247ef87366d5df86bf701083b6c43119c7c6c99108"},
|
{file = "regex-2020.10.11-cp38-cp38-win_amd64.whl", hash = "sha256:f579caecbbca291b0fcc7d473664c8c08635da2f9b1567c22ea32311c86ef68c"},
|
||||||
{file = "regex-2020.5.14.tar.gz", hash = "sha256:ce450ffbfec93821ab1fea94779a8440e10cf63819be6e176eb1973a6017aff5"},
|
{file = "regex-2020.10.11-cp39-cp39-manylinux1_i686.whl", hash = "sha256:8c8c42aa5d3ac9a49829c4b28a81bebfa0378996f9e0ca5b5ab8a36870c3e5ee"},
|
||||||
|
{file = "regex-2020.10.11-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:c529ba90c1775697a65b46c83d47a2d3de70f24d96da5d41d05a761c73b063af"},
|
||||||
|
{file = "regex-2020.10.11-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:6cf527ec2f3565248408b61dd36e380d799c2a1047eab04e13a2b0c15dd9c767"},
|
||||||
|
{file = "regex-2020.10.11-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:671c51d352cfb146e48baee82b1ee8d6ffe357c292f5e13300cdc5c00867ebfc"},
|
||||||
|
{file = "regex-2020.10.11-cp39-cp39-win32.whl", hash = "sha256:a63907332531a499b8cdfd18953febb5a4c525e9e7ca4ac147423b917244b260"},
|
||||||
|
{file = "regex-2020.10.11-cp39-cp39-win_amd64.whl", hash = "sha256:1a16afbfadaadc1397353f9b32e19a65dc1d1804c80ad73a14f435348ca017ad"},
|
||||||
|
{file = "regex-2020.10.11.tar.gz", hash = "sha256:463e770c48da76a8da82b8d4a48a541f314e0df91cbb6d873a341dbe578efafd"},
|
||||||
]
|
]
|
||||||
requests = [
|
requests = [
|
||||||
{file = "requests-2.23.0-py2.py3-none-any.whl", hash = "sha256:43999036bfa82904b6af1d99e4882b560e5e2c68e5c4b0aa03b655f3d7d73fee"},
|
{file = "requests-2.24.0-py2.py3-none-any.whl", hash = "sha256:fe75cc94a9443b9246fc7049224f75604b113c36acb93f87b80ed42c44cbb898"},
|
||||||
{file = "requests-2.23.0.tar.gz", hash = "sha256:b3f43d496c6daba4493e7c431722aeb7dbc6288f52a6e04e7b6023b0247817e6"},
|
{file = "requests-2.24.0.tar.gz", hash = "sha256:b3559a131db72c33ee969480840fff4bb6dd111de7dd27c8ee1f820f4f00231b"},
|
||||||
]
|
]
|
||||||
six = [
|
six = [
|
||||||
{file = "six-1.14.0-py2.py3-none-any.whl", hash = "sha256:8f3cd2e254d8f793e7f3d6d9df77b92252b52637291d0f0da013c76ea2724b6c"},
|
{file = "six-1.15.0-py2.py3-none-any.whl", hash = "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced"},
|
||||||
{file = "six-1.14.0.tar.gz", hash = "sha256:236bdbdce46e6e6a3d61a337c0f8b763ca1e8717c03b369e87a7ec7ce1319c0a"},
|
{file = "six-1.15.0.tar.gz", hash = "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259"},
|
||||||
]
|
]
|
||||||
tenacity = [
|
tenacity = [
|
||||||
{file = "tenacity-6.2.0-py2.py3-none-any.whl", hash = "sha256:5a5d3dcd46381abe8b4f82b5736b8726fd3160c6c7161f53f8af7f1eb9b82173"},
|
{file = "tenacity-6.2.0-py2.py3-none-any.whl", hash = "sha256:5a5d3dcd46381abe8b4f82b5736b8726fd3160c6c7161f53f8af7f1eb9b82173"},
|
||||||
|
@ -660,22 +657,22 @@ typed-ast = [
|
||||||
{file = "typed_ast-1.4.1.tar.gz", hash = "sha256:8c8aaad94455178e3187ab22c8b01a3837f8ee50e09cf31f1ba129eb293ec30b"},
|
{file = "typed_ast-1.4.1.tar.gz", hash = "sha256:8c8aaad94455178e3187ab22c8b01a3837f8ee50e09cf31f1ba129eb293ec30b"},
|
||||||
]
|
]
|
||||||
typing-extensions = [
|
typing-extensions = [
|
||||||
{file = "typing_extensions-3.7.4.2-py2-none-any.whl", hash = "sha256:f8d2bd89d25bc39dabe7d23df520442fa1d8969b82544370e03d88b5a591c392"},
|
{file = "typing_extensions-3.7.4.3-py2-none-any.whl", hash = "sha256:dafc7639cde7f1b6e1acc0f457842a83e722ccca8eef5270af2d74792619a89f"},
|
||||||
{file = "typing_extensions-3.7.4.2-py3-none-any.whl", hash = "sha256:6e95524d8a547a91e08f404ae485bbb71962de46967e1b71a0cb89af24e761c5"},
|
{file = "typing_extensions-3.7.4.3-py3-none-any.whl", hash = "sha256:7cb407020f00f7bfc3cb3e7881628838e69d8f3fcab2f64742a5e76b2f841918"},
|
||||||
{file = "typing_extensions-3.7.4.2.tar.gz", hash = "sha256:79ee589a3caca649a9bfd2a8de4709837400dfa00b6cc81962a1e6a1815969ae"},
|
{file = "typing_extensions-3.7.4.3.tar.gz", hash = "sha256:99d4073b617d30288f569d3f13d2bd7548c3a7e4c8de87db09a9d29bb3a4a60c"},
|
||||||
]
|
]
|
||||||
urllib3 = [
|
urllib3 = [
|
||||||
{file = "urllib3-1.25.9-py2.py3-none-any.whl", hash = "sha256:88206b0eb87e6d677d424843ac5209e3fb9d0190d0ee169599165ec25e9d9115"},
|
{file = "urllib3-1.25.10-py2.py3-none-any.whl", hash = "sha256:e7983572181f5e1522d9c98453462384ee92a0be7fac5f1413a1e35c56cc0461"},
|
||||||
{file = "urllib3-1.25.9.tar.gz", hash = "sha256:3018294ebefce6572a474f0604c2021e33b3fd8006ecd11d62107a5d2a963527"},
|
{file = "urllib3-1.25.10.tar.gz", hash = "sha256:91056c15fa70756691db97756772bb1eb9678fa585d9184f24534b100dc60f4a"},
|
||||||
]
|
]
|
||||||
wcwidth = [
|
wcwidth = [
|
||||||
{file = "wcwidth-0.1.9-py2.py3-none-any.whl", hash = "sha256:cafe2186b3c009a04067022ce1dcd79cb38d8d65ee4f4791b8888d6599d1bbe1"},
|
{file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"},
|
||||||
{file = "wcwidth-0.1.9.tar.gz", hash = "sha256:ee73862862a156bf77ff92b09034fc4825dd3af9cf81bc5b360668d425f3c5f1"},
|
{file = "wcwidth-0.2.5.tar.gz", hash = "sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83"},
|
||||||
]
|
]
|
||||||
wrapt = [
|
wrapt = [
|
||||||
{file = "wrapt-1.11.2.tar.gz", hash = "sha256:565a021fd19419476b9362b05eeaa094178de64f8361e44468f9e9d7843901e1"},
|
{file = "wrapt-1.11.2.tar.gz", hash = "sha256:565a021fd19419476b9362b05eeaa094178de64f8361e44468f9e9d7843901e1"},
|
||||||
]
|
]
|
||||||
zipp = [
|
zipp = [
|
||||||
{file = "zipp-3.1.0-py3-none-any.whl", hash = "sha256:aa36550ff0c0b7ef7fa639055d797116ee891440eac1a56f378e2d3179e0320b"},
|
{file = "zipp-3.3.0-py3-none-any.whl", hash = "sha256:eed8ec0b8d1416b2ca33516a37a08892442f3954dee131e92cfd92d8fe3e7066"},
|
||||||
{file = "zipp-3.1.0.tar.gz", hash = "sha256:c599e4d75c98f6798c509911d08a22e6c021d074469042177c8c86fb92eefd96"},
|
{file = "zipp-3.3.0.tar.gz", hash = "sha256:64ad89efee774d1897a58607895d80789c59778ea02185dd846ac38394a8642b"},
|
||||||
]
|
]
|
||||||
|
|
|
@ -30,7 +30,6 @@ class ADOClient:
|
||||||
|
|
||||||
:param str username: The username for the user who is accessing the API
|
:param str username: The username for the user who is accessing the API
|
||||||
:param str tenant: The ADO tenant to connect to
|
:param str tenant: The ADO tenant to connect to
|
||||||
:param str project_id: The identifier for the project
|
|
||||||
:param str repository_id: The identifier for the repository
|
:param str repository_id: The identifier for the repository
|
||||||
:param Tuple[str,str] credentials: The credentials to use for the API connection
|
:param Tuple[str,str] credentials: The credentials to use for the API connection
|
||||||
:param str status_context: The context for any statuses placed on a PR or commit
|
:param str status_context: The context for any statuses placed on a PR or commit
|
||||||
|
@ -59,7 +58,6 @@ class ADOClient:
|
||||||
*,
|
*,
|
||||||
username: str,
|
username: str,
|
||||||
tenant: str,
|
tenant: str,
|
||||||
project_id: str,
|
|
||||||
repository_id: str,
|
repository_id: str,
|
||||||
credentials: Tuple[str, str],
|
credentials: Tuple[str, str],
|
||||||
status_context: str,
|
status_context: str,
|
||||||
|
@ -78,11 +76,7 @@ class ADOClient:
|
||||||
)
|
)
|
||||||
|
|
||||||
self.http_client = ADOHTTPClient(
|
self.http_client = ADOHTTPClient(
|
||||||
tenant=tenant,
|
tenant=tenant, credentials=credentials, log=self.log, extra_headers=extra_headers,
|
||||||
project_id=project_id,
|
|
||||||
credentials=credentials,
|
|
||||||
log=self.log,
|
|
||||||
extra_headers=extra_headers,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
self.builds = ADOBuildClient(self.context, self.http_client, self.log)
|
self.builds = ADOBuildClient(self.context, self.http_client, self.log)
|
||||||
|
@ -214,6 +208,7 @@ class ADOClient:
|
||||||
is_project: bool = True,
|
is_project: bool = True,
|
||||||
is_internal: bool = False,
|
is_internal: bool = False,
|
||||||
subdomain: Optional[str] = None,
|
subdomain: Optional[str] = None,
|
||||||
|
project_id: Optional[str] = None,
|
||||||
) -> ADOResponse:
|
) -> ADOResponse:
|
||||||
"""Perform a custom GET REST request.
|
"""Perform a custom GET REST request.
|
||||||
|
|
||||||
|
@ -232,6 +227,7 @@ class ADOClient:
|
||||||
:param bool is_project: Whether this URL should scope down to include `project_id`
|
:param bool is_project: Whether this URL should scope down to include `project_id`
|
||||||
:param bool is_internal: Whether this URL should use internal API endpoint "/_api"
|
:param bool is_internal: Whether this URL should use internal API endpoint "/_api"
|
||||||
:param Optional[str] subdomain: A subdomain that should be used (if any)
|
:param Optional[str] subdomain: A subdomain that should be used (if any)
|
||||||
|
:param Optional[str] project_id: The project ID. This must be set if `is_project` is set
|
||||||
|
|
||||||
:returns: The raw response
|
:returns: The raw response
|
||||||
"""
|
"""
|
||||||
|
@ -242,6 +238,7 @@ class ADOClient:
|
||||||
is_project=is_project,
|
is_project=is_project,
|
||||||
is_internal=is_internal,
|
is_internal=is_internal,
|
||||||
subdomain=subdomain,
|
subdomain=subdomain,
|
||||||
|
project_id=project_id,
|
||||||
)
|
)
|
||||||
request_url += f"/{url_fragment}?{encoded_parameters}"
|
request_url += f"/{url_fragment}?{encoded_parameters}"
|
||||||
|
|
||||||
|
|
|
@ -48,7 +48,6 @@ class ADOHTTPClient:
|
||||||
"""Base class that actually makes API calls to Azure DevOps.
|
"""Base class that actually makes API calls to Azure DevOps.
|
||||||
|
|
||||||
:param str tenant: The name of the ADO tenant to connect to
|
:param str tenant: The name of the ADO tenant to connect to
|
||||||
:param str project_id: The ID of the ADO project to connect to
|
|
||||||
:param Dict[str,str] extra_headers: Any extra headers which should be added to each request
|
:param Dict[str,str] extra_headers: Any extra headers which should be added to each request
|
||||||
:param Tuple[str,str] credentials: The credentials which should be used for authentication
|
:param Tuple[str,str] credentials: The credentials which should be used for authentication
|
||||||
:param logging.Logger log: The logger to use for logging
|
:param logging.Logger log: The logger to use for logging
|
||||||
|
@ -56,7 +55,6 @@ class ADOHTTPClient:
|
||||||
|
|
||||||
log: logging.Logger
|
log: logging.Logger
|
||||||
tenant: str
|
tenant: str
|
||||||
project_id: str
|
|
||||||
extra_headers: Dict[str, str]
|
extra_headers: Dict[str, str]
|
||||||
credentials: Tuple[str, str]
|
credentials: Tuple[str, str]
|
||||||
|
|
||||||
|
@ -64,7 +62,6 @@ class ADOHTTPClient:
|
||||||
self,
|
self,
|
||||||
*,
|
*,
|
||||||
tenant: str,
|
tenant: str,
|
||||||
project_id: str,
|
|
||||||
credentials: Tuple[str, str],
|
credentials: Tuple[str, str],
|
||||||
log: logging.Logger,
|
log: logging.Logger,
|
||||||
extra_headers: Optional[Dict[str, str]] = None,
|
extra_headers: Optional[Dict[str, str]] = None,
|
||||||
|
@ -74,7 +71,6 @@ class ADOHTTPClient:
|
||||||
self.log = log.getChild("http")
|
self.log = log.getChild("http")
|
||||||
|
|
||||||
self.tenant = tenant
|
self.tenant = tenant
|
||||||
self.project_id = project_id
|
|
||||||
self.credentials = credentials
|
self.credentials = credentials
|
||||||
|
|
||||||
if extra_headers is None:
|
if extra_headers is None:
|
||||||
|
@ -89,13 +85,16 @@ class ADOHTTPClient:
|
||||||
is_project: bool = True,
|
is_project: bool = True,
|
||||||
is_vssps: bool = False,
|
is_vssps: bool = False,
|
||||||
subdomain: Optional[str] = None,
|
subdomain: Optional[str] = None,
|
||||||
|
project_id: Optional[str] = None,
|
||||||
) -> str:
|
) -> str:
|
||||||
"""Generate the base url for all API calls (this varies depending on the API).
|
"""Generate the base url for all API calls (this varies depending on the API).
|
||||||
|
|
||||||
:param bool is_default_collection: Whether this URL should start with the path "/DefaultCollection"
|
:param bool is_default_collection: Whether this URL should start with the path "/DefaultCollection"
|
||||||
:param bool is_project: Whether this URL should scope down to include `project_id`
|
:param bool is_project: Whether this URL should scope down to include `project_id`. If this
|
||||||
|
is True, `project_id` must be set
|
||||||
:param bool is_vssps: Whether this URL is a VSSPS URL (all other parameters are ignored in that case)
|
:param bool is_vssps: Whether this URL is a VSSPS URL (all other parameters are ignored in that case)
|
||||||
:param Optional[str] subdomain: A subdomain that should be used (if any)
|
:param Optional[str] subdomain: A subdomain that should be used (if any)
|
||||||
|
:param Optional[str] project_id: The project ID. This must be set if `is_project` is set
|
||||||
|
|
||||||
:returns: The constructed base URL
|
:returns: The constructed base URL
|
||||||
"""
|
"""
|
||||||
|
@ -114,7 +113,11 @@ class ADOHTTPClient:
|
||||||
url += "/DefaultCollection"
|
url += "/DefaultCollection"
|
||||||
|
|
||||||
if is_project:
|
if is_project:
|
||||||
url += f"/{self.project_id}"
|
if not project_id:
|
||||||
|
raise ADOException(
|
||||||
|
"The `is_project` parameter was set, but no project ID was provided"
|
||||||
|
)
|
||||||
|
url += f"/{project_id}"
|
||||||
|
|
||||||
return url
|
return url
|
||||||
|
|
||||||
|
@ -126,6 +129,7 @@ class ADOHTTPClient:
|
||||||
is_internal: bool = False,
|
is_internal: bool = False,
|
||||||
is_vssps: bool = False,
|
is_vssps: bool = False,
|
||||||
subdomain: Optional[str] = None,
|
subdomain: Optional[str] = None,
|
||||||
|
project_id: Optional[str] = None,
|
||||||
) -> str:
|
) -> str:
|
||||||
"""Generate the base url for all API calls (this varies depending on the API).
|
"""Generate the base url for all API calls (this varies depending on the API).
|
||||||
|
|
||||||
|
@ -134,6 +138,7 @@ class ADOHTTPClient:
|
||||||
:param bool is_internal: Whether this URL should use internal API endpoint "/_api"
|
:param bool is_internal: Whether this URL should use internal API endpoint "/_api"
|
||||||
:param bool is_vssps: Whether this URL is a VSSPS URL (all other parameters are ignored in that case)
|
:param bool is_vssps: Whether this URL is a VSSPS URL (all other parameters are ignored in that case)
|
||||||
:param Optional[str] subdomain: A subdomain that should be used (if any)
|
:param Optional[str] subdomain: A subdomain that should be used (if any)
|
||||||
|
:param Optional[str] project_id: The project ID. This must be set if `is_project` is set
|
||||||
|
|
||||||
:returns: The constructed base URL
|
:returns: The constructed base URL
|
||||||
"""
|
"""
|
||||||
|
@ -143,6 +148,7 @@ class ADOHTTPClient:
|
||||||
is_project=is_project,
|
is_project=is_project,
|
||||||
is_vssps=is_vssps,
|
is_vssps=is_vssps,
|
||||||
subdomain=subdomain,
|
subdomain=subdomain,
|
||||||
|
project_id=project_id,
|
||||||
)
|
)
|
||||||
|
|
||||||
if is_internal:
|
if is_internal:
|
||||||
|
|
|
@ -75,27 +75,37 @@ class ADOSecurityClient(ADOBaseClient):
|
||||||
) -> None:
|
) -> None:
|
||||||
super().__init__(context, http_client, log.getChild("security"))
|
super().__init__(context, http_client, log.getChild("security"))
|
||||||
|
|
||||||
def get_policies(self) -> ADOResponse:
|
def get_policies(self, project_id: str) -> ADOResponse:
|
||||||
"""Gets the existing policies.
|
"""Gets the existing policies.
|
||||||
|
|
||||||
|
:param project_id: The identifier for the project
|
||||||
|
|
||||||
:returns: The ADO response with the data in it
|
:returns: The ADO response with the data in it
|
||||||
"""
|
"""
|
||||||
|
request_url = (
|
||||||
request_url = f"{self.http_client.api_endpoint(is_project=True)}/policy/Configurations?api-version=5.0"
|
self.http_client.api_endpoint(is_project=True, project_id=project_id)
|
||||||
|
+ "/policy/Configurations?api-version=5.0"
|
||||||
|
)
|
||||||
response = self.http_client.get(request_url)
|
response = self.http_client.get(request_url)
|
||||||
response_data = self.http_client.decode_response(response)
|
response_data = self.http_client.decode_response(response)
|
||||||
return self.http_client.extract_value(response_data)
|
return self.http_client.extract_value(response_data)
|
||||||
|
|
||||||
def add_branch_build_policy(self, branch: str, *, build_definition_id: int) -> ADOResponse:
|
def add_branch_build_policy(
|
||||||
|
self, *, branch: str, build_definition_id: int, project_id: str
|
||||||
|
) -> ADOResponse:
|
||||||
"""Adds a new build policy for a given branch.
|
"""Adds a new build policy for a given branch.
|
||||||
|
|
||||||
:param str branch: The git branch to set the build policy for
|
:param str branch: The git branch to set the build policy for
|
||||||
:param int build_definition_id: The build definition to use when creating the build policy
|
:param int build_definition_id: The build definition to use when creating the build policy
|
||||||
|
:param str project_id: The identifier for the project
|
||||||
|
|
||||||
:returns: The ADO response with the data in it
|
:returns: The ADO response with the data in it
|
||||||
"""
|
"""
|
||||||
|
|
||||||
request_url = f"{self.http_client.api_endpoint(is_project=True)}/policy/Configurations?api-version=5.0"
|
request_url = (
|
||||||
|
self.http_client.api_endpoint(is_project=True, project_id=project_id)
|
||||||
|
+ "/policy/Configurations?api-version=5.0"
|
||||||
|
)
|
||||||
|
|
||||||
body = {
|
body = {
|
||||||
"type": {"id": ADOBranchPolicy.BUILD.value},
|
"type": {"id": ADOBranchPolicy.BUILD.value},
|
||||||
|
@ -123,18 +133,22 @@ class ADOSecurityClient(ADOBaseClient):
|
||||||
return self.http_client.decode_response(response)
|
return self.http_client.decode_response(response)
|
||||||
|
|
||||||
def add_branch_required_reviewers_policy(
|
def add_branch_required_reviewers_policy(
|
||||||
self, branch: str, *, identities: List[str]
|
self, *, branch: str, identities: List[str], project_id: str
|
||||||
) -> ADOResponse:
|
) -> ADOResponse:
|
||||||
"""Adds required reviewers when opening PRs against a given branch.
|
"""Adds required reviewers when opening PRs against a given branch.
|
||||||
|
|
||||||
:param str branch: The git branch to set required reviewers for
|
:param str branch: The git branch to set required reviewers for
|
||||||
:param List[str] identities: A list of identities to become required
|
:param List[str] identities: A list of identities to become required
|
||||||
reviewers (should be team foundation IDs)
|
reviewers (should be team foundation IDs)
|
||||||
|
:param str project_id: The identifier for the project
|
||||||
|
|
||||||
:returns: The ADO response with the data in it
|
:returns: The ADO response with the data in it
|
||||||
"""
|
"""
|
||||||
|
|
||||||
request_url = f"{self.http_client.api_endpoint(is_project=True)}/policy/Configurations?api-version=5.0"
|
request_url = (
|
||||||
|
self.http_client.api_endpoint(is_project=True, project_id=project_id)
|
||||||
|
+ "/policy/Configurations?api-version=5.0"
|
||||||
|
)
|
||||||
|
|
||||||
body = {
|
body = {
|
||||||
"type": {"id": ADOBranchPolicy.REQUIRED_REVIEWERS.value},
|
"type": {"id": ADOBranchPolicy.REQUIRED_REVIEWERS.value},
|
||||||
|
@ -163,11 +177,12 @@ class ADOSecurityClient(ADOBaseClient):
|
||||||
|
|
||||||
def set_branch_approval_count_policy(
|
def set_branch_approval_count_policy(
|
||||||
self,
|
self,
|
||||||
branch: str,
|
|
||||||
*,
|
*,
|
||||||
|
branch: str,
|
||||||
minimum_approver_count: int,
|
minimum_approver_count: int,
|
||||||
creator_vote_counts: bool = False,
|
creator_vote_counts: bool = False,
|
||||||
reset_on_source_push: bool = False,
|
reset_on_source_push: bool = False,
|
||||||
|
project_id: str,
|
||||||
) -> ADOResponse:
|
) -> ADOResponse:
|
||||||
"""Set minimum number of reviewers for a branch.
|
"""Set minimum number of reviewers for a branch.
|
||||||
|
|
||||||
|
@ -175,11 +190,15 @@ class ADOSecurityClient(ADOBaseClient):
|
||||||
:param int minimum_approver_count: The minimum number of approvals required
|
:param int minimum_approver_count: The minimum number of approvals required
|
||||||
:param bool creator_vote_counts: Allow users to approve their own changes
|
:param bool creator_vote_counts: Allow users to approve their own changes
|
||||||
:param bool reset_on_source_push: Reset reviewer votes when there are new changes
|
:param bool reset_on_source_push: Reset reviewer votes when there are new changes
|
||||||
|
:param project_id: The identifier for the project
|
||||||
|
|
||||||
:returns: The ADO response with the data in it
|
:returns: The ADO response with the data in it
|
||||||
"""
|
"""
|
||||||
|
|
||||||
request_url = f"{self.http_client.api_endpoint(is_project=True)}/policy/Configurations?api-version=5.0"
|
request_url = (
|
||||||
|
self.http_client.api_endpoint(is_project=True, project_id=project_id)
|
||||||
|
+ "/policy/Configurations?api-version=5.0"
|
||||||
|
)
|
||||||
|
|
||||||
body = {
|
body = {
|
||||||
"type": {"id": ADOBranchPolicy.APPROVAL_COUNT.value},
|
"type": {"id": ADOBranchPolicy.APPROVAL_COUNT.value},
|
||||||
|
@ -204,16 +223,22 @@ class ADOSecurityClient(ADOBaseClient):
|
||||||
response = self.http_client.post(request_url, json_data=body)
|
response = self.http_client.post(request_url, json_data=body)
|
||||||
return self.http_client.decode_response(response)
|
return self.http_client.decode_response(response)
|
||||||
|
|
||||||
def set_branch_work_item_policy(self, branch: str, *, required: bool = True) -> ADOResponse:
|
def set_branch_work_item_policy(
|
||||||
|
self, *, branch: str, required: bool = True, project_id: str
|
||||||
|
) -> ADOResponse:
|
||||||
"""Set the work item policy for a branch.
|
"""Set the work item policy for a branch.
|
||||||
|
|
||||||
:param str branch: The git branch to set the work item policy on
|
:param str branch: The git branch to set the work item policy on
|
||||||
:param bool required: Whether or not linked work items should be mandatory
|
:param bool required: Whether or not linked work items should be mandatory
|
||||||
|
:param project_id: The identifier for the project
|
||||||
|
|
||||||
:returns: The ADO response with the data in it
|
:returns: The ADO response with the data in it
|
||||||
"""
|
"""
|
||||||
|
|
||||||
request_url = f"{self.http_client.api_endpoint(is_project=True)}/policy/Configurations?api-version=5.0"
|
request_url = (
|
||||||
|
self.http_client.api_endpoint(is_project=True, project_id=project_id)
|
||||||
|
+ "/policy/Configurations?api-version=5.0"
|
||||||
|
)
|
||||||
|
|
||||||
body = {
|
body = {
|
||||||
"type": {"id": ADOBranchPolicy.WORK_ITEM.value},
|
"type": {"id": ADOBranchPolicy.WORK_ITEM.value},
|
||||||
|
@ -237,23 +262,29 @@ class ADOSecurityClient(ADOBaseClient):
|
||||||
|
|
||||||
def set_branch_permissions(
|
def set_branch_permissions(
|
||||||
self,
|
self,
|
||||||
branch: str,
|
|
||||||
*,
|
*,
|
||||||
|
branch: str,
|
||||||
identity: TeamFoundationId,
|
identity: TeamFoundationId,
|
||||||
permissions: Dict[ADOBranchPermission, ADOBranchPermissionLevel],
|
permissions: Dict[ADOBranchPermission, ADOBranchPermissionLevel],
|
||||||
|
project_id: str,
|
||||||
) -> ADOResponse:
|
) -> ADOResponse:
|
||||||
"""Set permissions for an identity on a branch.
|
"""Set permissions for an identity on a branch.
|
||||||
|
|
||||||
:param str branch: The git branch to set permissions on
|
:param str branch: The git branch to set permissions on
|
||||||
:param TeamFoundationId identity: The identity to set permissions for (should be team foundation ID)
|
:param TeamFoundationId identity: The identity to set permissions for (should be team foundation ID)
|
||||||
:param Dict[ADOBranchPermission,ADOBranchPermissionLevel] permissions: A dictionary of permissions to set
|
:param Dict[ADOBranchPermission,ADOBranchPermissionLevel] permissions: A dictionary of permissions to set
|
||||||
|
:param project_id: The identifier for the project
|
||||||
|
|
||||||
:returns: The ADO response with the data in it
|
:returns: The ADO response with the data in it
|
||||||
"""
|
"""
|
||||||
|
|
||||||
descriptor_info = self._get_descriptor_info(branch, identity)
|
descriptor_info = self._get_descriptor_info(
|
||||||
|
branch=branch, team_foundation_id=identity, project_id=project_id
|
||||||
|
)
|
||||||
|
|
||||||
request_url = self.http_client.api_endpoint(is_project=True, is_internal=True)
|
request_url = self.http_client.api_endpoint(
|
||||||
|
is_project=True, is_internal=True, project_id=project_id
|
||||||
|
)
|
||||||
request_url += "/_security/ManagePermissions?__v=5"
|
request_url += "/_security/ManagePermissions?__v=5"
|
||||||
|
|
||||||
updates = []
|
updates = []
|
||||||
|
@ -263,7 +294,7 @@ class ADOSecurityClient(ADOBaseClient):
|
||||||
"PermissionId": level,
|
"PermissionId": level,
|
||||||
"PermissionBit": permission,
|
"PermissionBit": permission,
|
||||||
"NamespaceId": ADOSecurityClient.GIT_PERMISSIONS_NAMESPACE,
|
"NamespaceId": ADOSecurityClient.GIT_PERMISSIONS_NAMESPACE,
|
||||||
"Token": self._generate_updates_token(branch),
|
"Token": self._generate_updates_token(branch, project_id),
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -273,7 +304,7 @@ class ADOSecurityClient(ADOBaseClient):
|
||||||
"DescriptorIdentityType": descriptor_info["type"],
|
"DescriptorIdentityType": descriptor_info["type"],
|
||||||
"DescriptorIdentifier": descriptor_info["id"],
|
"DescriptorIdentifier": descriptor_info["id"],
|
||||||
"PermissionSetId": ADOSecurityClient.GIT_PERMISSIONS_NAMESPACE,
|
"PermissionSetId": ADOSecurityClient.GIT_PERMISSIONS_NAMESPACE,
|
||||||
"PermissionSetToken": self._generate_permission_set_token(branch),
|
"PermissionSetToken": self._generate_permission_set_token(branch, project_id),
|
||||||
"RefreshIdentities": False,
|
"RefreshIdentities": False,
|
||||||
"Updates": updates,
|
"Updates": updates,
|
||||||
"TokenDisplayName": None,
|
"TokenDisplayName": None,
|
||||||
|
@ -285,25 +316,28 @@ class ADOSecurityClient(ADOBaseClient):
|
||||||
return self.http_client.decode_response(response)
|
return self.http_client.decode_response(response)
|
||||||
|
|
||||||
def _get_descriptor_info(
|
def _get_descriptor_info(
|
||||||
self, branch: str, team_foundation_id: TeamFoundationId
|
self, *, branch: str, team_foundation_id: TeamFoundationId, project_id: str
|
||||||
) -> Dict[str, str]:
|
) -> Dict[str, str]:
|
||||||
"""Fetch the descriptor identity information for a given identity.
|
"""Fetch the descriptor identity information for a given identity.
|
||||||
|
|
||||||
:param str branch: The git branch of interest
|
:param str branch: The git branch of interest
|
||||||
:param TeamFoundationId team_foundation_id: the unique Team Foundation GUID for the identity
|
:param TeamFoundationId team_foundation_id: the unique Team Foundation GUID for the identity
|
||||||
|
:param project_id: The identifier for the project
|
||||||
|
|
||||||
:returns: The raw descriptor info
|
:returns: The raw descriptor info
|
||||||
|
|
||||||
:raises ADOException: If we can't determine the descriptor info from the response
|
:raises ADOException: If we can't determine the descriptor info from the response
|
||||||
"""
|
"""
|
||||||
|
|
||||||
request_url = self.http_client.api_endpoint(is_project=True, is_internal=True)
|
request_url = self.http_client.api_endpoint(
|
||||||
|
is_project=True, is_internal=True, project_id=project_id
|
||||||
|
)
|
||||||
request_url += "/_security/DisplayPermissions?"
|
request_url += "/_security/DisplayPermissions?"
|
||||||
|
|
||||||
parameters = {
|
parameters = {
|
||||||
"tfid": team_foundation_id,
|
"tfid": team_foundation_id,
|
||||||
"permissionSetId": ADOSecurityClient.GIT_PERMISSIONS_NAMESPACE,
|
"permissionSetId": ADOSecurityClient.GIT_PERMISSIONS_NAMESPACE,
|
||||||
"permissionSetToken": self._generate_permission_set_token(branch),
|
"permissionSetToken": self._generate_permission_set_token(branch, project_id),
|
||||||
"__v": "5",
|
"__v": "5",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -325,20 +359,22 @@ class ADOSecurityClient(ADOBaseClient):
|
||||||
|
|
||||||
return descriptor_info
|
return descriptor_info
|
||||||
|
|
||||||
def _generate_permission_set_token(self, branch: str) -> str:
|
def _generate_permission_set_token(self, branch: str, project_id: str) -> str:
|
||||||
"""Generate the token required for reading identity details and writing permissions.
|
"""Generate the token required for reading identity details and writing permissions.
|
||||||
|
|
||||||
:param str branch: The git branch of interest
|
:param str branch: The git branch of interest
|
||||||
|
:param str project_id: The ID for the project
|
||||||
|
|
||||||
:returns: The permission token
|
:returns: The permission token
|
||||||
"""
|
"""
|
||||||
encoded_branch = branch.replace("/", "^")
|
encoded_branch = branch.replace("/", "^")
|
||||||
return f"repoV2/{self.http_client.project_id}/{self.context.repository_id}/refs^heads^{encoded_branch}/"
|
return f"repoV2/{project_id}/{self.context.repository_id}/refs^heads^{encoded_branch}/"
|
||||||
|
|
||||||
def _generate_updates_token(self, branch: str) -> str:
|
def _generate_updates_token(self, branch: str, project_id: str) -> str:
|
||||||
"""Generate the token required for updating permissions.
|
"""Generate the token required for updating permissions.
|
||||||
|
|
||||||
:param str branch: The git branch of interest
|
:param str branch: The git branch of interest
|
||||||
|
:param str project_id: The ID for the project
|
||||||
|
|
||||||
:returns: The update token
|
:returns: The update token
|
||||||
"""
|
"""
|
||||||
|
@ -348,4 +384,4 @@ class ADOSecurityClient(ADOBaseClient):
|
||||||
|
|
||||||
encoded_branch = "/".join(encoded_branch_nodes)
|
encoded_branch = "/".join(encoded_branch_nodes)
|
||||||
|
|
||||||
return f"repoV2/{self.http_client.project_id}/{self.context.repository_id}/refs/heads/{encoded_branch}/"
|
return f"repoV2/{project_id}/{self.context.repository_id}/refs/heads/{encoded_branch}/"
|
||||||
|
|
|
@ -26,7 +26,6 @@ class LibraryTests(unittest.TestCase):
|
||||||
self.client = simple_ado.ADOClient(
|
self.client = simple_ado.ADOClient(
|
||||||
username=self.test_config.username,
|
username=self.test_config.username,
|
||||||
tenant=self.test_config.tenant,
|
tenant=self.test_config.tenant,
|
||||||
project_id=self.test_config.project_id,
|
|
||||||
repository_id=self.test_config.repository_id,
|
repository_id=self.test_config.repository_id,
|
||||||
credentials=(self.test_config.username, self.test_config.token),
|
credentials=(self.test_config.username, self.test_config.token),
|
||||||
status_context="simple_ado",
|
status_context="simple_ado",
|
||||||
|
|
Загрузка…
Ссылка в новой задаче