py2docfx 0.1.11.dev1987375__py3-none-any.whl → 0.1.11.dev1989123__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. py2docfx/__main__.py +1 -1
  2. py2docfx/convert_prepare/generate_document.py +3 -3
  3. py2docfx/convert_prepare/sphinx_caller.py +23 -5
  4. py2docfx/convert_prepare/tests/test_generate_document.py +4 -2
  5. py2docfx/convert_prepare/tests/test_sphinx_caller.py +4 -3
  6. py2docfx/venv/venv1/Lib/site-packages/azure/identity/_credentials/authorization_code.py +1 -1
  7. py2docfx/venv/venv1/Lib/site-packages/azure/identity/_credentials/azd_cli.py +20 -14
  8. py2docfx/venv/venv1/Lib/site-packages/azure/identity/_credentials/azure_arc.py +1 -1
  9. py2docfx/venv/venv1/Lib/site-packages/azure/identity/_credentials/azure_cli.py +36 -14
  10. py2docfx/venv/venv1/Lib/site-packages/azure/identity/_credentials/azure_powershell.py +1 -1
  11. py2docfx/venv/venv1/Lib/site-packages/azure/identity/_credentials/chained.py +2 -2
  12. py2docfx/venv/venv1/Lib/site-packages/azure/identity/_credentials/default.py +4 -3
  13. py2docfx/venv/venv1/Lib/site-packages/azure/identity/_credentials/imds.py +2 -2
  14. py2docfx/venv/venv1/Lib/site-packages/azure/identity/_credentials/managed_identity.py +1 -1
  15. py2docfx/venv/venv1/Lib/site-packages/azure/identity/_internal/__init__.py +2 -0
  16. py2docfx/venv/venv1/Lib/site-packages/azure/identity/_internal/auth_code_redirect_handler.py +1 -1
  17. py2docfx/venv/venv1/Lib/site-packages/azure/identity/_internal/decorators.py +15 -7
  18. py2docfx/venv/venv1/Lib/site-packages/azure/identity/_internal/interactive.py +1 -1
  19. py2docfx/venv/venv1/Lib/site-packages/azure/identity/_internal/managed_identity_client.py +0 -1
  20. py2docfx/venv/venv1/Lib/site-packages/azure/identity/_internal/msal_client.py +1 -1
  21. py2docfx/venv/venv1/Lib/site-packages/azure/identity/_internal/msal_managed_identity_client.py +2 -1
  22. py2docfx/venv/venv1/Lib/site-packages/azure/identity/_internal/shared_token_cache.py +3 -3
  23. py2docfx/venv/venv1/Lib/site-packages/azure/identity/_internal/utils.py +17 -2
  24. py2docfx/venv/venv1/Lib/site-packages/azure/identity/_version.py +1 -1
  25. py2docfx/venv/venv1/Lib/site-packages/azure/identity/aio/_credentials/azd_cli.py +14 -11
  26. py2docfx/venv/venv1/Lib/site-packages/azure/identity/aio/_credentials/azure_cli.py +30 -12
  27. py2docfx/venv/venv1/Lib/site-packages/azure/identity/aio/_credentials/default.py +2 -2
  28. py2docfx/venv/venv1/Lib/site-packages/azure/identity/aio/_credentials/imds.py +3 -3
  29. py2docfx/venv/venv1/Lib/site-packages/azure/identity/aio/_credentials/managed_identity.py +1 -1
  30. py2docfx/venv/venv1/Lib/site-packages/azure/identity/aio/_internal/decorators.py +15 -7
  31. py2docfx/venv/venv1/Lib/site-packages/azure/identity/aio/_internal/managed_identity_client.py +1 -1
  32. py2docfx/venv/venv1/Lib/site-packages/cryptography/__about__.py +1 -1
  33. {py2docfx-0.1.11.dev1987375.dist-info → py2docfx-0.1.11.dev1989123.dist-info}/METADATA +1 -1
  34. {py2docfx-0.1.11.dev1987375.dist-info → py2docfx-0.1.11.dev1989123.dist-info}/RECORD +36 -36
  35. {py2docfx-0.1.11.dev1987375.dist-info → py2docfx-0.1.11.dev1989123.dist-info}/WHEEL +0 -0
  36. {py2docfx-0.1.11.dev1987375.dist-info → py2docfx-0.1.11.dev1989123.dist-info}/top_level.txt +0 -0
py2docfx/__main__.py CHANGED
@@ -49,7 +49,7 @@ async def donwload_package_generate_documents(
49
49
  py2docfx_logger.error(msg)
50
50
  raise
51
51
 
52
- generate_document(package, output_root,
52
+ await generate_document(package, output_root,
53
53
  py2docfxEnvironment.get_base_venv_sphinx_build_path(),
54
54
  py2docfxEnvironment.get_venv_package_path(idx),
55
55
  py2docfxEnvironment.get_base_venv_exe())
@@ -10,7 +10,7 @@ from py2docfx.convert_prepare.subpackage import merge_subpackage_files
10
10
 
11
11
  CONF_TEMPLATE_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "conf_templates")
12
12
 
13
- def generate_document(pkg: PackageInfo, output_root: str | os.PathLike, sphinx_build_path: str, extra_package_path: str, executable=sys.executable):
13
+ async def generate_document(pkg: PackageInfo, output_root: str | os.PathLike, sphinx_build_path: str, extra_package_path: str, executable=sys.executable):
14
14
  py2docfx_logger = get_package_logger(__name__, pkg.name)
15
15
  # Copy manual written RST from target doc repo
16
16
  package_paths = pkg.path
@@ -45,7 +45,7 @@ def generate_document(pkg: PackageInfo, output_root: str | os.PathLike, sphinx_b
45
45
  py2docfx_logger.info(msg)
46
46
 
47
47
  generate_conf(pkg, package_paths.doc_folder, CONF_TEMPLATE_DIR)
48
- run_converter(pkg.name, package_paths.doc_folder, package_paths.yaml_output_folder, sphinx_build_path, extra_package_path, executable=executable)
48
+ await run_converter(pkg.name, package_paths.doc_folder, package_paths.yaml_output_folder, sphinx_build_path, extra_package_path, executable=executable)
49
49
 
50
50
  subpackages_path_record = {}
51
51
  if pkg.build_in_subpackage:
@@ -53,6 +53,6 @@ def generate_document(pkg: PackageInfo, output_root: str | os.PathLike, sphinx_b
53
53
  for (subpackage_name, subpackage_path) in subpackages_rst_record.items():
54
54
  subpackage_yaml_path = os.path.join(subpackages_yaml_path, subpackage_name)
55
55
  subpackages_path_record[subpackage_name] = subpackage_yaml_path
56
- run_converter(pkg.name, subpackage_path, subpackage_yaml_path, sphinx_build_path, extra_package_path, executable=executable)
56
+ await run_converter(pkg.name, subpackage_path, subpackage_yaml_path, sphinx_build_path, extra_package_path, executable=executable)
57
57
 
58
58
  merge_subpackage_files(subpackages_path_record, package_paths.yaml_output_folder, pkg.name)
@@ -1,3 +1,4 @@
1
+ import asyncio
1
2
  import os
2
3
  import subprocess
3
4
  import sys
@@ -49,7 +50,7 @@ def run_apidoc(package_name, rst_path, source_code_path, exclude_paths, package_
49
50
  return subpackages_rst_record
50
51
 
51
52
 
52
- def run_converter(package_name: str,
53
+ async def run_converter(package_name: str,
53
54
  rst_path,
54
55
  out_path,
55
56
  sphinx_build_path: str,
@@ -75,7 +76,7 @@ def run_converter(package_name: str,
75
76
  py2docfx_logger.error(msg)
76
77
  raise ValueError()
77
78
  sphinx_param = [
78
- executable,
79
+ # executable,
79
80
  sphinx_build_path,
80
81
  rst_path,
81
82
  outdir,
@@ -92,8 +93,25 @@ def run_converter(package_name: str,
92
93
  env_tmp["PYTHONPATH"] = f"{extra_package_path};{package_root_parent};"
93
94
  else:
94
95
  env_tmp["PYTHONPATH"] = f"{extra_package_path}:{package_root_parent}:"
95
-
96
- output = subprocess.run(sphinx_param, check=False, cwd=PACKAGE_ROOT, env=env_tmp, capture_output=True ,text=True)
97
- log_subprocess_ouput(output, py2docfx_logger)
96
+
97
+ proc = await asyncio.create_subprocess_exec(
98
+ executable, *sphinx_param,
99
+ cwd=PACKAGE_ROOT,
100
+ env=env_tmp,
101
+ stdout=asyncio.subprocess.PIPE,
102
+ stderr=asyncio.subprocess.PIPE
103
+ )
104
+ stdout, stderr = await proc.communicate()
105
+ return_code = proc.returncode
106
+
107
+ if return_code == 0:
108
+ py2docfx_logger.info(f"{stdout}")
109
+ py2docfx_logger.info(f"{stderr}")
110
+ else:
111
+ py2docfx_logger.error(f"{stderr}")
112
+ raise subprocess.CalledProcessError(return_code, sphinx_param, stdout, stderr)
113
+
114
+ # output = subprocess.run(sphinx_param, check=False, cwd=PACKAGE_ROOT, env=env_tmp, capture_output=True ,text=True)
115
+ # log_subprocess_ouput(output, py2docfx_logger)
98
116
 
99
117
  return outdir
@@ -4,6 +4,7 @@ Test the generate_document function.
4
4
  import os
5
5
  import sys
6
6
  import shutil
7
+ import pytest
7
8
  import sphinx
8
9
  import sphinx.cmd.build
9
10
 
@@ -11,7 +12,8 @@ from py2docfx.convert_prepare.generate_document import generate_document
11
12
  from py2docfx.convert_prepare.package_info import PackageInfo
12
13
  from py2docfx.convert_prepare.source import Source
13
14
 
14
- def test_generate_document(tmp_path):
15
+ @pytest.mark.asyncio
16
+ async def test_generate_document(tmp_path):
15
17
  """
16
18
  Test the generate_document function.
17
19
  """
@@ -42,7 +44,7 @@ def test_generate_document(tmp_path):
42
44
 
43
45
  # call the function
44
46
 
45
- generate_document(package, output_root, sphinx_build_path = sphinx.cmd.build.__file__, extra_package_path = source_folder)
47
+ await generate_document(package, output_root, sphinx_build_path = sphinx.cmd.build.__file__, extra_package_path = source_folder)
46
48
 
47
49
  #assert the result
48
50
  yaml_path = os.path.join(yaml_output_folder, "_build", "docfx_yaml")
@@ -1,5 +1,6 @@
1
1
  import os
2
2
  import shutil
3
+ import pytest
3
4
  import sphinx
4
5
  import sphinx.cmd.build
5
6
 
@@ -34,8 +35,8 @@ def test_run_apidoc(tmp_path):
34
35
  assert "testcode.fakemodule.rst" in rst_list
35
36
  assert "testcode.exclude.rst" not in rst_list
36
37
 
37
-
38
- def test_run_converter(tmp_path):
38
+ @pytest.mark.asyncio
39
+ async def test_run_converter(tmp_path):
39
40
  rst_path, source_code_path = init_paths(tmp_path)
40
41
  package_name = "testcode"
41
42
  run_apidoc(package_name, rst_path, source_code_path, package_info.get_exluded_command(), package_info)
@@ -50,7 +51,7 @@ def test_run_converter(tmp_path):
50
51
  index_rst.write("")
51
52
 
52
53
  out_path = os.path.join(tmp_path, "out")
53
- out_path = run_converter(package_name, rst_path, out_path, sphinx_build_path = sphinx.cmd.build.__file__, extra_package_path = source_code_path, conf_path=rst_path)
54
+ out_path = await run_converter(package_name, rst_path, out_path, sphinx_build_path = sphinx.cmd.build.__file__, extra_package_path = source_code_path, conf_path=rst_path)
54
55
 
55
56
  if os.path.exists(out_path):
56
57
  yaml_list = os.listdir(os.path.join(out_path, "docfx_yaml"))
@@ -85,7 +85,7 @@ class AuthorizationCodeCredential(GetTokenMixin):
85
85
  attribute gives a reason. Any error response from Microsoft Entra ID is available as the error's
86
86
  ``response`` attribute.
87
87
  """
88
- # pylint:disable=useless-super-delegation
88
+
89
89
  return super(AuthorizationCodeCredential, self).get_token(
90
90
  *scopes, claims=claims, tenant_id=tenant_id, client_secret=self._client_secret, **kwargs
91
91
  )
@@ -5,6 +5,7 @@
5
5
 
6
6
  from datetime import datetime
7
7
  import json
8
+ import logging
8
9
  import os
9
10
  import re
10
11
  import shutil
@@ -19,12 +20,15 @@ from .. import CredentialUnavailableError
19
20
  from .._internal import resolve_tenant, within_dac, validate_tenant_id, validate_scope
20
21
  from .._internal.decorators import log_get_token
21
22
 
23
+
24
+ _LOGGER = logging.getLogger(__name__)
25
+
22
26
  CLI_NOT_FOUND = (
23
27
  "Azure Developer CLI could not be found. "
24
28
  "Please visit https://aka.ms/azure-dev for installation instructions and then,"
25
29
  "once installed, authenticate to your Azure account using 'azd auth login'."
26
30
  )
27
- COMMAND_LINE = "azd auth token --output json --scope {}"
31
+ COMMAND_LINE = ["auth", "token", "--output", "json"]
28
32
  EXECUTABLE_NAME = "azd"
29
33
  NOT_LOGGED_IN = "Please run 'azd auth login' from a command prompt to authenticate before using this credential."
30
34
 
@@ -160,8 +164,9 @@ class AzureDeveloperCliCredential:
160
164
  for scope in scopes:
161
165
  validate_scope(scope)
162
166
 
163
- commandString = " --scope ".join(scopes)
164
- command = COMMAND_LINE.format(commandString)
167
+ command_args = COMMAND_LINE.copy()
168
+ for scope in scopes:
169
+ command_args += ["--scope", scope]
165
170
  tenant = resolve_tenant(
166
171
  default_tenant=self.tenant_id,
167
172
  tenant_id=tenant_id,
@@ -169,8 +174,8 @@ class AzureDeveloperCliCredential:
169
174
  **kwargs,
170
175
  )
171
176
  if tenant:
172
- command += " --tenant-id " + tenant
173
- output = _run_command(command, self._process_timeout)
177
+ command_args += ["--tenant-id", tenant]
178
+ output = _run_command(command_args, self._process_timeout)
174
179
 
175
180
  token = parse_token(output)
176
181
  if not token:
@@ -236,15 +241,13 @@ def sanitize_output(output: str) -> str:
236
241
  return re.sub(r"\"token\": \"(.*?)(\"|$)", "****", output)
237
242
 
238
243
 
239
- def _run_command(command: str, timeout: int) -> str:
244
+ def _run_command(command_args: List[str], timeout: int) -> str:
240
245
  # Ensure executable exists in PATH first. This avoids a subprocess call that would fail anyway.
241
- if shutil.which(EXECUTABLE_NAME) is None:
246
+ azd_path = shutil.which(EXECUTABLE_NAME)
247
+ if not azd_path:
242
248
  raise CredentialUnavailableError(message=CLI_NOT_FOUND)
243
249
 
244
- if sys.platform.startswith("win"):
245
- args = ["cmd", "/c", command]
246
- else:
247
- args = ["/bin/sh", "-c", command]
250
+ args = [azd_path] + command_args
248
251
  try:
249
252
  working_directory = get_safe_working_dir()
250
253
 
@@ -257,13 +260,16 @@ def _run_command(command: str, timeout: int) -> str:
257
260
  "timeout": timeout,
258
261
  }
259
262
 
263
+ _LOGGER.debug("Executing subprocess with the following arguments %s", args)
260
264
  return subprocess.check_output(args, **kwargs)
261
265
  except subprocess.CalledProcessError as ex:
262
266
  # non-zero return from shell
263
267
  # Fallback check in case the executable is not found while executing subprocess.
264
- if ex.returncode == 127 or ex.stderr.startswith("'azd' is not recognized"):
268
+ if ex.returncode == 127 or (ex.stderr is not None and ex.stderr.startswith("'azd' is not recognized")):
265
269
  raise CredentialUnavailableError(message=CLI_NOT_FOUND) from ex
266
- if "not logged in, run `azd auth login` to login" in ex.stderr and "AADSTS" not in ex.stderr:
270
+ if ex.stderr is not None and (
271
+ "not logged in, run `azd auth login` to login" in ex.stderr and "AADSTS" not in ex.stderr
272
+ ):
267
273
  raise CredentialUnavailableError(message=NOT_LOGGED_IN) from ex
268
274
 
269
275
  # return code is from the CLI -> propagate its output
@@ -278,7 +284,7 @@ def _run_command(command: str, timeout: int) -> str:
278
284
  # failed to execute 'cmd' or '/bin/sh'
279
285
  error = CredentialUnavailableError(message="Failed to execute '{}'".format(args[0]))
280
286
  raise error from ex
281
- except Exception as ex: # pylint:disable=broad-except
287
+ except Exception as ex:
282
288
  # could be a timeout, for example
283
289
  error = CredentialUnavailableError(message="Failed to invoke the Azure Developer CLI")
284
290
  raise error from ex
@@ -54,7 +54,7 @@ def _get_secret_key(response: PipelineResponse) -> str:
54
54
  with open(key_file, "r", encoding="utf-8") as file:
55
55
  try:
56
56
  return file.read()
57
- except Exception as error: # pylint:disable=broad-except
57
+ except Exception as error:
58
58
  # user is expected to have obtained read permission prior to this being called
59
59
  raise ClientAuthenticationError(
60
60
  message="Could not read file {} contents: {}".format(key_file, error)
@@ -6,6 +6,7 @@ from datetime import datetime
6
6
  import json
7
7
  import os
8
8
  import re
9
+ import logging
9
10
  import shutil
10
11
  import subprocess
11
12
  import sys
@@ -15,12 +16,22 @@ from azure.core.credentials import AccessToken, AccessTokenInfo, TokenRequestOpt
15
16
  from azure.core.exceptions import ClientAuthenticationError
16
17
 
17
18
  from .. import CredentialUnavailableError
18
- from .._internal import _scopes_to_resource, resolve_tenant, within_dac, validate_tenant_id, validate_scope
19
+ from .._internal import (
20
+ _scopes_to_resource,
21
+ resolve_tenant,
22
+ within_dac,
23
+ validate_tenant_id,
24
+ validate_scope,
25
+ validate_subscription,
26
+ )
19
27
  from .._internal.decorators import log_get_token
20
28
 
21
29
 
30
+ _LOGGER = logging.getLogger(__name__)
31
+
22
32
  CLI_NOT_FOUND = "Azure CLI not found on path"
23
- COMMAND_LINE = "az account get-access-token --output json --resource {}"
33
+ # COMMAND_LINE = "account get-access-token --output json --resource {}"
34
+ COMMAND_LINE = ["account", "get-access-token", "--output", "json"]
24
35
  EXECUTABLE_NAME = "az"
25
36
  NOT_LOGGED_IN = "Please run 'az login' to set up an account"
26
37
 
@@ -31,6 +42,8 @@ class AzureCliCredential:
31
42
  This requires previously logging in to Azure via "az login", and will use the CLI's currently logged in identity.
32
43
 
33
44
  :keyword str tenant_id: Optional tenant to include in the token request.
45
+ :keyword str subscription: The name or ID of a subscription. Set this to acquire tokens for an account other
46
+ than the Azure CLI's current account.
34
47
  :keyword List[str] additionally_allowed_tenants: Specifies tenants in addition to the specified "tenant_id"
35
48
  for which the credential may acquire tokens. Add the wildcard value "*" to allow the credential to
36
49
  acquire tokens for any tenant the application can access.
@@ -50,12 +63,17 @@ class AzureCliCredential:
50
63
  self,
51
64
  *,
52
65
  tenant_id: str = "",
66
+ subscription: Optional[str] = None,
53
67
  additionally_allowed_tenants: Optional[List[str]] = None,
54
68
  process_timeout: int = 10,
55
69
  ) -> None:
56
70
  if tenant_id:
57
71
  validate_tenant_id(tenant_id)
72
+ if subscription:
73
+ validate_subscription(subscription)
74
+
58
75
  self.tenant_id = tenant_id
76
+ self.subscription = subscription
59
77
  self._additionally_allowed_tenants = additionally_allowed_tenants or []
60
78
  self._process_timeout = process_timeout
61
79
 
@@ -135,7 +153,7 @@ class AzureCliCredential:
135
153
  validate_scope(scope)
136
154
 
137
155
  resource = _scopes_to_resource(*scopes)
138
- command = COMMAND_LINE.format(resource)
156
+ command_args = COMMAND_LINE + ["--resource", resource]
139
157
  tenant = resolve_tenant(
140
158
  default_tenant=self.tenant_id,
141
159
  tenant_id=tenant_id,
@@ -143,8 +161,11 @@ class AzureCliCredential:
143
161
  **kwargs,
144
162
  )
145
163
  if tenant:
146
- command += " --tenant " + tenant
147
- output = _run_command(command, self._process_timeout)
164
+ command_args += ["--tenant", tenant]
165
+
166
+ if self.subscription:
167
+ command_args += ["--subscription", self.subscription]
168
+ output = _run_command(command_args, self._process_timeout)
148
169
 
149
170
  token = parse_token(output)
150
171
  if not token:
@@ -211,15 +232,13 @@ def sanitize_output(output: str) -> str:
211
232
  return re.sub(r"\"accessToken\": \"(.*?)(\"|$)", "****", output)
212
233
 
213
234
 
214
- def _run_command(command: str, timeout: int) -> str:
235
+ def _run_command(command_args: List[str], timeout: int) -> str:
215
236
  # Ensure executable exists in PATH first. This avoids a subprocess call that would fail anyway.
216
- if shutil.which(EXECUTABLE_NAME) is None:
237
+ az_path = shutil.which(EXECUTABLE_NAME)
238
+ if not az_path:
217
239
  raise CredentialUnavailableError(message=CLI_NOT_FOUND)
218
240
 
219
- if sys.platform.startswith("win"):
220
- args = ["cmd", "/c", command]
221
- else:
222
- args = ["/bin/sh", "-c", command]
241
+ args = [az_path] + command_args
223
242
  try:
224
243
  working_directory = get_safe_working_dir()
225
244
 
@@ -231,13 +250,16 @@ def _run_command(command: str, timeout: int) -> str:
231
250
  "timeout": timeout,
232
251
  "env": dict(os.environ, AZURE_CORE_NO_COLOR="true"),
233
252
  }
253
+ _LOGGER.debug("Executing subprocess with the following arguments %s", args)
234
254
  return subprocess.check_output(args, **kwargs)
235
255
  except subprocess.CalledProcessError as ex:
236
256
  # non-zero return from shell
237
257
  # Fallback check in case the executable is not found while executing subprocess.
238
- if ex.returncode == 127 or ex.stderr.startswith("'az' is not recognized"):
258
+ if ex.returncode == 127 or (ex.stderr is not None and ex.stderr.startswith("'az' is not recognized")):
239
259
  raise CredentialUnavailableError(message=CLI_NOT_FOUND) from ex
240
- if ("az login" in ex.stderr or "az account set" in ex.stderr) and "AADSTS" not in ex.stderr:
260
+ if ex.stderr is not None and (
261
+ ("az login" in ex.stderr or "az account set" in ex.stderr) and "AADSTS" not in ex.stderr
262
+ ):
241
263
  raise CredentialUnavailableError(message=NOT_LOGGED_IN) from ex
242
264
 
243
265
  # return code is from the CLI -> propagate its output
@@ -252,7 +274,7 @@ def _run_command(command: str, timeout: int) -> str:
252
274
  # failed to execute 'cmd' or '/bin/sh'
253
275
  error = CredentialUnavailableError(message="Failed to execute '{}'".format(args[0]))
254
276
  raise error from ex
255
- except Exception as ex: # pylint:disable=broad-except
277
+ except Exception as ex:
256
278
  # could be a timeout, for example
257
279
  error = CredentialUnavailableError(message="Failed to invoke the Azure CLI")
258
280
  raise error from ex
@@ -192,7 +192,7 @@ def run_command_line(command_line: List[str], timeout: int) -> str:
192
192
  proc = start_process(command_line)
193
193
  stdout, stderr = proc.communicate(**kwargs)
194
194
 
195
- except Exception as ex: # pylint:disable=broad-except
195
+ except Exception as ex:
196
196
  # failed to execute "cmd" or "/bin/sh", or timed out; PowerShell and Az.Account may or may not be installed
197
197
  # (handling Exception here because subprocess.SubprocessError and .TimeoutExpired were added in 3.3)
198
198
  if proc and not proc.returncode:
@@ -37,8 +37,8 @@ class ChainedTokenCredential:
37
37
  """A sequence of credentials that is itself a credential.
38
38
 
39
39
  Its :func:`get_token` method calls ``get_token`` on each credential in the sequence, in order, returning the first
40
- valid token received. For more information, see
41
- https://aka.ms/azsdk/python/identity/credential-chains#chainedtokencredential-overview.
40
+ valid token received. For more information, see `ChainedTokenCredential overview
41
+ <"https://aka.ms/azsdk/python/identity/credential-chains#chainedtokencredential-overview">`__.
42
42
 
43
43
  :param credentials: credential instances to form the chain
44
44
  :type credentials: ~azure.core.credentials.TokenCredential
@@ -24,8 +24,9 @@ _LOGGER = logging.getLogger(__name__)
24
24
 
25
25
 
26
26
  class DefaultAzureCredential(ChainedTokenCredential):
27
- """A credential capable of handling most Azure SDK authentication scenarios. See
28
- https://aka.ms/azsdk/python/identity/credential-chains#usage-guidance-for-defaultazurecredential.
27
+ """A credential capable of handling most Azure SDK authentication scenarios. For more information, See
28
+ `Usage guidance for DefaultAzureCredential
29
+ <"https://aka.ms/azsdk/python/identity/credential-chains#usage-guidance-for-defaultazurecredential">`__.
29
30
 
30
31
  The identity it uses depends on the environment. When an access token is needed, it requests one using these
31
32
  identities in turn, stopping when one provides a token:
@@ -153,7 +154,7 @@ class DefaultAzureCredential(ChainedTokenCredential):
153
154
  WorkloadIdentityCredential(
154
155
  client_id=cast(str, client_id),
155
156
  tenant_id=workload_identity_tenant_id,
156
- file=os.environ[EnvironmentVariables.AZURE_FEDERATED_TOKEN_FILE],
157
+ token_file_path=os.environ[EnvironmentVariables.AZURE_FEDERATED_TOKEN_FILE],
157
158
  **kwargs
158
159
  )
159
160
  )
@@ -89,7 +89,7 @@ class ImdsCredential(MsalManagedIdentityClient):
89
89
  # IMDS responded
90
90
  _check_forbidden_response(ex)
91
91
  self._endpoint_available = True
92
- except Exception as ex: # pylint:disable=broad-except
92
+ except Exception as ex:
93
93
  error_message = (
94
94
  "ManagedIdentityCredential authentication unavailable, no response from the IMDS endpoint."
95
95
  )
@@ -119,7 +119,7 @@ class ImdsCredential(MsalManagedIdentityClient):
119
119
  raise ClientAuthenticationError(message=ex.message, response=ex.response) from ex
120
120
  except json.decoder.JSONDecodeError as ex:
121
121
  raise CredentialUnavailableError(message="ManagedIdentityCredential authentication unavailable.") from ex
122
- except Exception as ex: # pylint:disable=broad-except
122
+ except Exception as ex:
123
123
  # if anything else was raised, assume the endpoint is unavailable
124
124
  error_message = "ManagedIdentityCredential authentication unavailable, no response from the IMDS endpoint."
125
125
  raise CredentialUnavailableError(error_message) from ex
@@ -108,7 +108,7 @@ class ManagedIdentityCredential:
108
108
  self._credential = WorkloadIdentityCredential(
109
109
  tenant_id=os.environ[EnvironmentVariables.AZURE_TENANT_ID],
110
110
  client_id=workload_client_id,
111
- file=os.environ[EnvironmentVariables.AZURE_FEDERATED_TOKEN_FILE],
111
+ token_file_path=os.environ[EnvironmentVariables.AZURE_FEDERATED_TOKEN_FILE],
112
112
  **kwargs,
113
113
  )
114
114
  else:
@@ -13,6 +13,7 @@ from .utils import (
13
13
  normalize_authority,
14
14
  resolve_tenant,
15
15
  validate_scope,
16
+ validate_subscription,
16
17
  validate_tenant_id,
17
18
  within_credential_chain,
18
19
  within_dac,
@@ -49,6 +50,7 @@ __all__ = [
49
50
  "normalize_authority",
50
51
  "resolve_tenant",
51
52
  "validate_scope",
53
+ "validate_subscription",
52
54
  "within_credential_chain",
53
55
  "within_dac",
54
56
  "wrap_exceptions",
@@ -28,7 +28,7 @@ class AuthCodeRedirectHandler(BaseHTTPRequestHandler):
28
28
 
29
29
  self.wfile.write(b"Authentication complete. You can close this window.")
30
30
 
31
- def log_message(self, format, *args): # pylint: disable=redefined-builtin,unused-argument
31
+ def log_message(self, format, *args): # pylint: disable=redefined-builtin
32
32
  pass # this prevents server dumping messages to stdout
33
33
 
34
34
 
@@ -22,24 +22,32 @@ def log_get_token(fn):
22
22
  try:
23
23
  token = fn(*args, **kwargs)
24
24
  _LOGGER.log(
25
- logging.DEBUG if within_credential_chain.get() else logging.INFO, "%s succeeded", fn.__qualname__
25
+ logging.DEBUG if within_credential_chain.get() else logging.INFO,
26
+ "%s succeeded",
27
+ fn.__qualname__,
26
28
  )
27
29
  if _LOGGER.isEnabledFor(logging.DEBUG):
28
30
  try:
29
- base64_meta_data = token.token.split(".")[1].encode("utf-8") + b"=="
30
- json_bytes = base64.decodebytes(base64_meta_data)
31
+ base64_meta_data = token.token.split(".")[1]
32
+ padding_needed = -len(base64_meta_data) % 4
33
+ if padding_needed:
34
+ base64_meta_data += "=" * padding_needed
35
+ json_bytes = base64.urlsafe_b64decode(base64_meta_data)
31
36
  json_string = json_bytes.decode("utf-8")
32
37
  json_dict = json.loads(json_string)
33
38
  upn = json_dict.get("upn", "unavailableUpn")
39
+ appid = json_dict.get("appid", "<unavailable>")
40
+ tid = json_dict.get("tid", "<unavailable>")
41
+ oid = json_dict.get("oid", "<unavailable>")
34
42
  log_string = (
35
- "[Authenticated account] Client ID: {}. Tenant ID: {}. User Principal Name: {}. "
36
- "Object ID (user): {}".format(json_dict["appid"], json_dict["tid"], upn, json_dict["oid"])
43
+ f"[Authenticated account] Client ID: {appid}. "
44
+ f"Tenant ID: {tid}. User Principal Name: {upn}. Object ID (user): {oid}"
37
45
  )
38
46
  _LOGGER.debug(log_string)
39
47
  except Exception as ex: # pylint: disable=broad-except
40
48
  _LOGGER.debug("Failed to log the account information: %s", ex, exc_info=True)
41
49
  return token
42
- except Exception as ex: # pylint: disable=broad-except
50
+ except Exception as ex:
43
51
  _LOGGER.log(
44
52
  logging.DEBUG if within_credential_chain.get() else logging.WARNING,
45
53
  "%s failed: %s",
@@ -67,7 +75,7 @@ def wrap_exceptions(fn):
67
75
  return fn(*args, **kwargs)
68
76
  except ClientAuthenticationError:
69
77
  raise
70
- except Exception as ex: # pylint:disable=broad-except
78
+ except Exception as ex:
71
79
  auth_error = ClientAuthenticationError(message="Authentication failed: {}".format(ex))
72
80
  raise auth_error from ex
73
81
 
@@ -224,7 +224,7 @@ class InteractiveCredential(MsalCredential, ABC):
224
224
 
225
225
  # this may be the first authentication, or the user may have authenticated a different identity
226
226
  self._auth_record = _build_auth_record(result)
227
- except Exception as ex: # pylint:disable=broad-except
227
+ except Exception as ex:
228
228
  _LOGGER.warning(
229
229
  "%s.%s failed: %s",
230
230
  self.__class__.__name__,
@@ -19,7 +19,6 @@ from .._internal.pipeline import build_pipeline
19
19
 
20
20
 
21
21
  class ManagedIdentityClientBase(abc.ABC):
22
- # pylint:disable=missing-client-constructor-parameter-credential
23
22
  def __init__(
24
23
  self,
25
24
  request_factory: Callable[[str, dict], HttpRequest],
@@ -7,7 +7,7 @@ from typing import Any, Dict, Optional, Union
7
7
 
8
8
  from azure.core.exceptions import ClientAuthenticationError
9
9
  from azure.core.pipeline.policies import ContentDecodePolicy
10
- from azure.core.pipeline.transport import ( # pylint:disable=unknown-option-value,no-legacy-azure-core-http-response-import
10
+ from azure.core.pipeline.transport import ( # pylint:disable=no-legacy-azure-core-http-response-import
11
11
  HttpRequest,
12
12
  HttpResponse,
13
13
  )
@@ -59,6 +59,7 @@ class MsalManagedIdentityClient(abc.ABC): # pylint:disable=client-accepts-api-v
59
59
  token_type=result.get("token_type", "Bearer"),
60
60
  refresh_on=refresh_on,
61
61
  )
62
+ error_desc = ""
62
63
  if result and "error" in result:
63
64
  error_desc = cast(str, result["error"])
64
65
  error_message = self.get_unavailable_message(error_desc)
@@ -186,7 +187,7 @@ class MsalManagedIdentityClient(abc.ABC): # pylint:disable=client-accepts-api-v
186
187
  exc_info=_LOGGER.isEnabledFor(logging.DEBUG),
187
188
  )
188
189
  raise ClientAuthenticationError(self.get_unavailable_message(str(ex))) from ex
189
- except Exception as ex: # pylint:disable=broad-except
190
+ except Exception as ex:
190
191
  _LOGGER.log(
191
192
  logging.DEBUG if within_credential_chain.get() else logging.WARNING,
192
193
  "%s.%s failed: %s",
@@ -88,7 +88,7 @@ class SharedTokenCacheBase(ABC): # pylint: disable=too-many-instance-attributes
88
88
  authority: Optional[str] = None,
89
89
  tenant_id: Optional[str] = None,
90
90
  **kwargs: Any
91
- ) -> None: # pylint:disable=unused-argument
91
+ ) -> None:
92
92
  self._authority = normalize_authority(authority) if authority else get_default_authority()
93
93
  environment = urlparse(self._authority).netloc
94
94
  self._environment_aliases = KNOWN_ALIASES.get(environment) or frozenset((environment,))
@@ -246,7 +246,7 @@ class SharedTokenCacheBase(ABC): # pylint: disable=too-many-instance-attributes
246
246
  return AccessTokenInfo(
247
247
  token["secret"], expires_on, token_type=token.get("token_type", "Bearer"), refresh_on=refresh_on
248
248
  )
249
- except Exception as ex: # pylint:disable=broad-except
249
+ except Exception as ex:
250
250
  message = "Error accessing cached data: {}".format(ex)
251
251
  raise CredentialUnavailableError(message=message) from ex
252
252
 
@@ -262,7 +262,7 @@ class SharedTokenCacheBase(ABC): # pylint: disable=too-many-instance-attributes
262
262
  msal.TokenCache.CredentialType.REFRESH_TOKEN, query={"home_account_id": account["home_account_id"]}
263
263
  )
264
264
  return [token["secret"] for token in cache_entries if "secret" in token]
265
- except Exception as ex: # pylint:disable=broad-except
265
+ except Exception as ex:
266
266
  message = "Error accessing cached data: {}".format(ex)
267
267
  raise CredentialUnavailableError(message=message) from ex
268
268
 
@@ -20,6 +20,7 @@ _LOGGER = logging.getLogger(__name__)
20
20
 
21
21
  VALID_TENANT_ID_CHARACTERS = frozenset(ascii_letters + digits + "-.")
22
22
  VALID_SCOPE_CHARACTERS = frozenset(ascii_letters + digits + "_-.:/")
23
+ VALID_SUBSCRIPTION_CHARACTERS = frozenset(ascii_letters + digits + "_-. ")
23
24
 
24
25
 
25
26
  def normalize_authority(authority: str) -> str:
@@ -68,7 +69,21 @@ def validate_tenant_id(tenant_id: str) -> None:
68
69
  if not tenant_id or any(c not in VALID_TENANT_ID_CHARACTERS for c in tenant_id):
69
70
  raise ValueError(
70
71
  "Invalid tenant ID provided. You can locate your tenant ID by following the instructions here: "
71
- + "https://learn.microsoft.com/partner-center/find-ids-and-domain-names"
72
+ "https://learn.microsoft.com/partner-center/find-ids-and-domain-names"
73
+ )
74
+
75
+
76
+ def validate_subscription(subscription: str) -> None:
77
+ """Raise ValueError if subscription is empty or contains a character invalid for a subscription name/ID.
78
+
79
+ :param str subscription: subscription ID to validate
80
+ :raises: ValueError if subscription is empty or contains a character invalid for a subscription ID.
81
+ """
82
+ if not subscription or any(c not in VALID_SUBSCRIPTION_CHARACTERS for c in subscription):
83
+ raise ValueError(
84
+ f"Subscription '{subscription}' contains invalid characters. If this is the name of a subscription, use "
85
+ "its ID instead. You can locate your subscription by following the instructions listed here: "
86
+ "https://learn.microsoft.com/azure/azure-portal/get-subscription-tenant-id"
72
87
  )
73
88
 
74
89
 
@@ -77,7 +92,7 @@ def resolve_tenant(
77
92
  tenant_id: Optional[str] = None,
78
93
  *,
79
94
  additionally_allowed_tenants: Optional[List[str]] = None,
80
- **_
95
+ **_,
81
96
  ) -> str:
82
97
  """Returns the correct tenant for a token request given a credential's configuration.
83
98
 
@@ -2,4 +2,4 @@
2
2
  # Copyright (c) Microsoft Corporation.
3
3
  # Licensed under the MIT License.
4
4
  # ------------------------------------
5
- VERSION = "1.19.0"
5
+ VERSION = "1.20.0"
@@ -3,6 +3,7 @@
3
3
  # Licensed under the MIT License.
4
4
  # ------------------------------------
5
5
  import asyncio
6
+ import logging
6
7
  import os
7
8
  import shutil
8
9
  import sys
@@ -26,6 +27,9 @@ from ..._credentials.azd_cli import (
26
27
  from ..._internal import resolve_tenant, within_dac, validate_tenant_id, validate_scope
27
28
 
28
29
 
30
+ _LOGGER = logging.getLogger(__name__)
31
+
32
+
29
33
  class AzureDeveloperCliCredential(AsyncContextManager):
30
34
  """Authenticates by requesting a token from the Azure Developer CLI.
31
35
 
@@ -153,8 +157,9 @@ class AzureDeveloperCliCredential(AsyncContextManager):
153
157
  for scope in scopes:
154
158
  validate_scope(scope)
155
159
 
156
- commandString = " --scope ".join(scopes)
157
- command = COMMAND_LINE.format(commandString)
160
+ command_args = COMMAND_LINE.copy()
161
+ for scope in scopes:
162
+ command_args += ["--scope", scope]
158
163
  tenant = resolve_tenant(
159
164
  default_tenant=self.tenant_id,
160
165
  tenant_id=tenant_id,
@@ -163,8 +168,8 @@ class AzureDeveloperCliCredential(AsyncContextManager):
163
168
  )
164
169
 
165
170
  if tenant:
166
- command += " --tenant-id " + tenant
167
- output = await _run_command(command, self._process_timeout)
171
+ command_args += ["--tenant-id", tenant]
172
+ output = await _run_command(command_args, self._process_timeout)
168
173
 
169
174
  token = parse_token(output)
170
175
  if not token:
@@ -184,19 +189,17 @@ class AzureDeveloperCliCredential(AsyncContextManager):
184
189
  """Calling this method is unnecessary"""
185
190
 
186
191
 
187
- async def _run_command(command: str, timeout: int) -> str:
192
+ async def _run_command(command_args: List[str], timeout: int) -> str:
188
193
  # Ensure executable exists in PATH first. This avoids a subprocess call that would fail anyway.
189
- if shutil.which(EXECUTABLE_NAME) is None:
194
+ azd_path = shutil.which(EXECUTABLE_NAME)
195
+ if not azd_path:
190
196
  raise CredentialUnavailableError(message=CLI_NOT_FOUND)
191
197
 
192
- if sys.platform.startswith("win"):
193
- args = ("cmd", "/c " + command)
194
- else:
195
- args = ("/bin/sh", "-c", command)
196
-
198
+ args = [azd_path] + command_args
197
199
  working_directory = get_safe_working_dir()
198
200
 
199
201
  try:
202
+ _LOGGER.debug("Executing subprocess with the following arguments %s", args)
200
203
  proc = await asyncio.create_subprocess_exec(
201
204
  *args,
202
205
  stdout=asyncio.subprocess.PIPE,
@@ -3,6 +3,7 @@
3
3
  # Licensed under the MIT License.
4
4
  # ------------------------------------
5
5
  import asyncio
6
+ import logging
6
7
  import os
7
8
  import shutil
8
9
  import sys
@@ -23,7 +24,17 @@ from ..._credentials.azure_cli import (
23
24
  parse_token,
24
25
  sanitize_output,
25
26
  )
26
- from ..._internal import _scopes_to_resource, resolve_tenant, within_dac, validate_tenant_id, validate_scope
27
+ from ..._internal import (
28
+ _scopes_to_resource,
29
+ resolve_tenant,
30
+ within_dac,
31
+ validate_tenant_id,
32
+ validate_scope,
33
+ validate_subscription,
34
+ )
35
+
36
+
37
+ _LOGGER = logging.getLogger(__name__)
27
38
 
28
39
 
29
40
  class AzureCliCredential(AsyncContextManager):
@@ -32,6 +43,8 @@ class AzureCliCredential(AsyncContextManager):
32
43
  This requires previously logging in to Azure via "az login", and will use the CLI's currently logged in identity.
33
44
 
34
45
  :keyword str tenant_id: Optional tenant to include in the token request.
46
+ :keyword str subscription: The name or ID of a subscription. Set this to acquire tokens for an account other
47
+ than the Azure CLI's current account.
35
48
  :keyword List[str] additionally_allowed_tenants: Specifies tenants in addition to the specified "tenant_id"
36
49
  for which the credential may acquire tokens. Add the wildcard value "*" to allow the credential to
37
50
  acquire tokens for any tenant the application can access.
@@ -51,12 +64,17 @@ class AzureCliCredential(AsyncContextManager):
51
64
  self,
52
65
  *,
53
66
  tenant_id: str = "",
67
+ subscription: Optional[str] = None,
54
68
  additionally_allowed_tenants: Optional[List[str]] = None,
55
69
  process_timeout: int = 10,
56
70
  ) -> None:
57
71
  if tenant_id:
58
72
  validate_tenant_id(tenant_id)
73
+ if subscription:
74
+ validate_subscription(subscription)
75
+
59
76
  self.tenant_id = tenant_id
77
+ self.subscription = subscription
60
78
  self._additionally_allowed_tenants = additionally_allowed_tenants or []
61
79
  self._process_timeout = process_timeout
62
80
 
@@ -131,7 +149,7 @@ class AzureCliCredential(AsyncContextManager):
131
149
  validate_scope(scope)
132
150
 
133
151
  resource = _scopes_to_resource(*scopes)
134
- command = COMMAND_LINE.format(resource)
152
+ command_args = COMMAND_LINE + ["--resource", resource]
135
153
  tenant = resolve_tenant(
136
154
  default_tenant=self.tenant_id,
137
155
  tenant_id=tenant_id,
@@ -140,8 +158,11 @@ class AzureCliCredential(AsyncContextManager):
140
158
  )
141
159
 
142
160
  if tenant:
143
- command += " --tenant " + tenant
144
- output = await _run_command(command, self._process_timeout)
161
+ command_args += ["--tenant", tenant]
162
+
163
+ if self.subscription:
164
+ command_args += ["--subscription", self.subscription]
165
+ output = await _run_command(command_args, self._process_timeout)
145
166
 
146
167
  token = parse_token(output)
147
168
  if not token:
@@ -161,19 +182,16 @@ class AzureCliCredential(AsyncContextManager):
161
182
  """Calling this method is unnecessary"""
162
183
 
163
184
 
164
- async def _run_command(command: str, timeout: int) -> str:
185
+ async def _run_command(command_args: List[str], timeout: int) -> str:
165
186
  # Ensure executable exists in PATH first. This avoids a subprocess call that would fail anyway.
166
- if shutil.which(EXECUTABLE_NAME) is None:
187
+ az_path = shutil.which(EXECUTABLE_NAME)
188
+ if not az_path:
167
189
  raise CredentialUnavailableError(message=CLI_NOT_FOUND)
168
190
 
169
- if sys.platform.startswith("win"):
170
- args = ("cmd", "/c " + command)
171
- else:
172
- args = ("/bin/sh", "-c", command)
173
-
191
+ args = [az_path] + command_args
174
192
  working_directory = get_safe_working_dir()
175
-
176
193
  try:
194
+ _LOGGER.debug("Executing subprocess with the following arguments %s", args)
177
195
  proc = await asyncio.create_subprocess_exec(
178
196
  *args,
179
197
  stdout=asyncio.subprocess.PIPE,
@@ -89,7 +89,7 @@ class DefaultAzureCredential(ChainedTokenCredential):
89
89
  :caption: Create a DefaultAzureCredential.
90
90
  """
91
91
 
92
- def __init__(self, **kwargs: Any) -> None: # pylint: disable=too-many-statements, too-many-locals
92
+ def __init__(self, **kwargs: Any) -> None: # pylint: disable=too-many-statements
93
93
  if "tenant_id" in kwargs:
94
94
  raise TypeError("'tenant_id' is not supported in DefaultAzureCredential.")
95
95
 
@@ -145,7 +145,7 @@ class DefaultAzureCredential(ChainedTokenCredential):
145
145
  WorkloadIdentityCredential(
146
146
  client_id=cast(str, client_id),
147
147
  tenant_id=workload_identity_tenant_id,
148
- file=os.environ[EnvironmentVariables.AZURE_FEDERATED_TOKEN_FILE],
148
+ token_file_path=os.environ[EnvironmentVariables.AZURE_FEDERATED_TOKEN_FILE],
149
149
  **kwargs
150
150
  )
151
151
  )
@@ -37,7 +37,7 @@ class ImdsCredential(AsyncContextManager, GetTokenMixin):
37
37
  async def _acquire_token_silently(self, *scopes: str, **kwargs: Any) -> Optional[AccessTokenInfo]:
38
38
  return self._client.get_cached_token(*scopes)
39
39
 
40
- async def _request_token(self, *scopes: str, **kwargs: Any) -> AccessTokenInfo: # pylint:disable=unused-argument
40
+ async def _request_token(self, *scopes: str, **kwargs: Any) -> AccessTokenInfo:
41
41
 
42
42
  if within_credential_chain.get() and not self._endpoint_available:
43
43
  # If within a chain (e.g. DefaultAzureCredential), we do a quick check to see if the IMDS endpoint
@@ -49,7 +49,7 @@ class ImdsCredential(AsyncContextManager, GetTokenMixin):
49
49
  # IMDS responded
50
50
  _check_forbidden_response(ex)
51
51
  self._endpoint_available = True
52
- except Exception as ex: # pylint:disable=broad-except
52
+ except Exception as ex:
53
53
  error_message = (
54
54
  "ManagedIdentityCredential authentication unavailable, no response from the IMDS endpoint."
55
55
  )
@@ -78,7 +78,7 @@ class ImdsCredential(AsyncContextManager, GetTokenMixin):
78
78
  _check_forbidden_response(ex)
79
79
  # any other error is unexpected
80
80
  raise ClientAuthenticationError(message=ex.message, response=ex.response) from ex
81
- except Exception as ex: # pylint:disable=broad-except
81
+ except Exception as ex:
82
82
  # if anything else was raised, assume the endpoint is unavailable
83
83
  error_message = "ManagedIdentityCredential authentication unavailable, no response from the IMDS endpoint."
84
84
  raise CredentialUnavailableError(error_message) from ex
@@ -96,7 +96,7 @@ class ManagedIdentityCredential(AsyncContextManager):
96
96
  self._credential = WorkloadIdentityCredential(
97
97
  tenant_id=os.environ[EnvironmentVariables.AZURE_TENANT_ID],
98
98
  client_id=workload_client_id,
99
- file=os.environ[EnvironmentVariables.AZURE_FEDERATED_TOKEN_FILE],
99
+ token_file_path=os.environ[EnvironmentVariables.AZURE_FEDERATED_TOKEN_FILE],
100
100
  **kwargs
101
101
  )
102
102
  else:
@@ -21,24 +21,32 @@ def log_get_token_async(fn):
21
21
  try:
22
22
  token = await fn(*args, **kwargs)
23
23
  _LOGGER.log(
24
- logging.DEBUG if within_credential_chain.get() else logging.INFO, "%s succeeded", fn.__qualname__
24
+ logging.DEBUG if within_credential_chain.get() else logging.INFO,
25
+ "%s succeeded",
26
+ fn.__qualname__,
25
27
  )
26
28
  if _LOGGER.isEnabledFor(logging.DEBUG):
27
29
  try:
28
- base64_meta_data = token.token.split(".")[1].encode("utf-8") + b"=="
29
- json_bytes = base64.decodebytes(base64_meta_data)
30
+ base64_meta_data = token.token.split(".")[1]
31
+ padding_needed = -len(base64_meta_data) % 4
32
+ if padding_needed:
33
+ base64_meta_data += "=" * padding_needed
34
+ json_bytes = base64.urlsafe_b64decode(base64_meta_data)
30
35
  json_string = json_bytes.decode("utf-8")
31
36
  json_dict = json.loads(json_string)
32
37
  upn = json_dict.get("upn", "unavailableUpn")
38
+ appid = json_dict.get("appid", "<unavailable>")
39
+ tid = json_dict.get("tid", "<unavailable>")
40
+ oid = json_dict.get("oid", "<unavailable>")
33
41
  log_string = (
34
- "[Authenticated account] Client ID: {}. Tenant ID: {}. User Principal Name: {}. "
35
- "Object ID (user): {}".format(json_dict["appid"], json_dict["tid"], upn, json_dict["oid"])
42
+ f"[Authenticated account] Client ID: {appid}. "
43
+ f"Tenant ID: {tid}. User Principal Name: {upn}. Object ID (user): {oid}"
36
44
  )
37
45
  _LOGGER.debug(log_string)
38
46
  except Exception as ex: # pylint: disable=broad-except
39
47
  _LOGGER.debug("Failed to log the account information: %s", ex, exc_info=True)
40
48
  return token
41
- except Exception as ex: # pylint: disable=broad-except
49
+ except Exception as ex:
42
50
  _LOGGER.log(
43
51
  logging.DEBUG if within_credential_chain.get() else logging.WARNING,
44
52
  "%s failed: %s",
@@ -67,7 +75,7 @@ def wrap_exceptions(fn):
67
75
  return result
68
76
  except ClientAuthenticationError:
69
77
  raise
70
- except Exception as ex: # pylint:disable=broad-except
78
+ except Exception as ex:
71
79
  auth_error = ClientAuthenticationError(message="Authentication failed: {}".format(ex))
72
80
  raise auth_error from ex
73
81
 
@@ -15,7 +15,7 @@ from ..._internal.pipeline import build_async_pipeline
15
15
  T = TypeVar("T", bound="AsyncManagedIdentityClient")
16
16
 
17
17
 
18
- # pylint:disable=async-client-bad-name,missing-client-constructor-parameter-credential
18
+ # pylint:disable=async-client-bad-name
19
19
  class AsyncManagedIdentityClient(AsyncContextManager, ManagedIdentityClientBase):
20
20
  async def __aenter__(self: T) -> T:
21
21
  await self._pipeline.__aenter__()
@@ -10,7 +10,7 @@ __all__ = [
10
10
  "__version__",
11
11
  ]
12
12
 
13
- __version__ = "44.0.0"
13
+ __version__ = "44.0.1"
14
14
 
15
15
 
16
16
  __author__ = "The Python Cryptographic Authority and individual contributors"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: py2docfx
3
- Version: 0.1.11.dev1987375
3
+ Version: 0.1.11.dev1989123
4
4
  Summary: A package built based on Sphinx which download source code package and generate yaml files supported by docfx.
5
5
  Author: Microsoft Corporation
6
6
  License: MIT License
@@ -1,11 +1,11 @@
1
1
  py2docfx/__init__.py,sha256=kPRhPGPC1JknDotkksG428c1iIgfFr_4_7Jm-llrowY,72
2
- py2docfx/__main__.py,sha256=J6GZNN2VV9WTRUceRlhLoyelxlYKQNgs-VKbp2AEWjM,5777
2
+ py2docfx/__main__.py,sha256=RAMBoN2fmo5noLFHnaWsfII82FVQiTKJrBU8tdr-RfQ,5783
3
3
  py2docfx/convert_prepare/__init__.py,sha256=XxtxrP0kmW3ZBHIAoxsPDEHzcgeC0WSnole8Lk6CjKs,11
4
4
  py2docfx/convert_prepare/arg_parser.py,sha256=Wa1iK8a0Gb3QqaS4X7nUPGvh-7mWhuBS9IVbmnjC770,7606
5
5
  py2docfx/convert_prepare/constants.py,sha256=RC5DqNkqWvx4hb91FrajZ1R9dBFLxcPyoEJ43jdm36E,102
6
6
  py2docfx/convert_prepare/environment.py,sha256=SpXy3oE9QuDOXK5J3lJd3kl-oXGATUDxe0K137zngXY,6988
7
7
  py2docfx/convert_prepare/generate_conf.py,sha256=wqs6iyElzJarH-20_qEL9zvZvt5xfBMsGXSXPSZy6wg,2295
8
- py2docfx/convert_prepare/generate_document.py,sha256=NCxppk5AtDxq9RZQVHxMNMd2ropiGloXyfENog5A7Ro,2919
8
+ py2docfx/convert_prepare/generate_document.py,sha256=vZ0WCHPQfQ11wFLclcKW-7mCkEgvJ1z90yn8BF04u5c,2937
9
9
  py2docfx/convert_prepare/get_source.py,sha256=AWkvjdobuoMGob_wBiw_SI5jeewcYUaCoaSZdGt4Hgc,5241
10
10
  py2docfx/convert_prepare/git.py,sha256=OIoaX_0LG5ueY8zmUwrbxl_YyMxwLzgTp6g0uSkC2Y0,6617
11
11
  py2docfx/convert_prepare/install_package.py,sha256=hATmgazcSX7k2n4jQXh9sQMyNUc1k1YqHv5K5UMALq4,262
@@ -17,7 +17,7 @@ py2docfx/convert_prepare/paths.py,sha256=964RX81Qf__rzXgEATfqBNFCKTYVjLt9J7WCz2T
17
17
  py2docfx/convert_prepare/pip_utils.py,sha256=GPWGUBcxW8JKreGwxZIAe9AWAI78aL1aFan8DvaAf1o,2228
18
18
  py2docfx/convert_prepare/repo_info.py,sha256=6ASJlhBwf6vZTSENgrWCVlJjlJVhuBxzdQyWEdWAC4c,117
19
19
  py2docfx/convert_prepare/source.py,sha256=6-A7oof3-WAQcQZZVpT9pKiFLH4CCIZeYqq0MN0O3gw,1710
20
- py2docfx/convert_prepare/sphinx_caller.py,sha256=ugSffECOVSainUvOkwy399hiRtKsP1iGv2qdxlv46dc,4278
20
+ py2docfx/convert_prepare/sphinx_caller.py,sha256=6ftolgangs8G7NRKRVLFB0Rhz5vI8RNXZbM6aI5yGGM,4882
21
21
  py2docfx/convert_prepare/subpackage.py,sha256=mXAi_07pXvnPkSLZfykDh_7VeFxfLy74pYlzhMO8N_Q,5183
22
22
  py2docfx/convert_prepare/utils.py,sha256=TwfDjIqIx_nAoSeQ-LX30h_-d96WhPQcAu7P8N_tSjM,1618
23
23
  py2docfx/convert_prepare/conf_templates/conf.py_t,sha256=8zxvY1WiG-z2aiSNDY0719C08QxZLXXEMwKfYSGN0ZE,3811
@@ -27,14 +27,14 @@ py2docfx/convert_prepare/subpackage_merge/merge_root_package.py,sha256=uK96qL2as
27
27
  py2docfx/convert_prepare/subpackage_merge/merge_toc.py,sha256=nkVqe8R0m8D6cyTYV7aIpMDXorvn4-LXfU_vIK_hJBg,1706
28
28
  py2docfx/convert_prepare/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
29
29
  py2docfx/convert_prepare/tests/test_environment.py,sha256=08oO7K7cDIOP3TNCVXh0bqYiok_sFpmBFOMbPYULLBk,2103
30
- py2docfx/convert_prepare/tests/test_generate_document.py,sha256=Llt3szDunwmFKhHxc8fKuov_ci5rQokMcOgu5QNqt0U,2572
30
+ py2docfx/convert_prepare/tests/test_generate_document.py,sha256=mY8DRT-WRGIBFdDRdFwa7ZSUQwR-fTQtyKwzrzFZLU8,2621
31
31
  py2docfx/convert_prepare/tests/test_get_source.py,sha256=49dgQrstyfokG4ZCM7tP6d33v2s7eGFpvb2EcR2GJzc,7711
32
32
  py2docfx/convert_prepare/tests/test_pack.py,sha256=xP-Khnj1MfPdIYaUDwXdvXNlI-uHQT3ihZ5d9zCZ914,4195
33
33
  py2docfx/convert_prepare/tests/test_package_info.py,sha256=3B-IzmUjETVO-5s3g3Lmh2E6JgopwnRauv8mB-SDZEM,3361
34
34
  py2docfx/convert_prepare/tests/test_params.py,sha256=itwmVdBMtU1qIXAGaIoaDfvTOYyAL2B_WLsaBV9KUZY,2232
35
35
  py2docfx/convert_prepare/tests/test_post_process_merge_toc.py,sha256=YKOcn4_lf4syGsAvJ9BqpdUUc3SLfK4TiOX1lpXJT_Y,885
36
36
  py2docfx/convert_prepare/tests/test_source.py,sha256=LNFZtvjz6QhVLOxatjWokYCCcoSm0bhTikMF9KoTPIE,2025
37
- py2docfx/convert_prepare/tests/test_sphinx_caller.py,sha256=Coeww4SrjYdtKYEktZvD2lQRnQZYSoQf6TmkFUxE0Uc,2701
37
+ py2docfx/convert_prepare/tests/test_sphinx_caller.py,sha256=yi2M4sct4o6-EBKz4Ye9_lyqwYMiSMLNiPhoBfkX5iw,2748
38
38
  py2docfx/convert_prepare/tests/test_subpackage.py,sha256=famt8LqwS8hCujtzvRLE5Ih8pa7t45y0d1EBk3UdYns,4984
39
39
  py2docfx/convert_prepare/tests/data/generate_document/azure-dummy-sourcecode/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
40
40
  py2docfx/convert_prepare/tests/data/generate_document/azure-dummy-sourcecode/azure/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -1971,28 +1971,28 @@ py2docfx/venv/venv1/Lib/site-packages/azure/identity/_constants.py,sha256=CawcaT
1971
1971
  py2docfx/venv/venv1/Lib/site-packages/azure/identity/_enums.py,sha256=kaZnPeoAQiEYVW19_BaXFaP_rt4viwfiIRPzYuo5rGs,2399
1972
1972
  py2docfx/venv/venv1/Lib/site-packages/azure/identity/_exceptions.py,sha256=Ilad2QoECsI81JrVIFV3gZfMEetA9EL5PoyBwzLIDWY,1954
1973
1973
  py2docfx/venv/venv1/Lib/site-packages/azure/identity/_persistent_cache.py,sha256=cCcS1K8dkuaVQ6GiPIsa1ifB8NM74Z2CAKm-Ty6CVLs,5840
1974
- py2docfx/venv/venv1/Lib/site-packages/azure/identity/_version.py,sha256=M3OI83SBsaFkPHlXizLcvsIrN1K5jJr3JSX1skyBYk0,170
1974
+ py2docfx/venv/venv1/Lib/site-packages/azure/identity/_version.py,sha256=ZFc7EBHITbgcUxJk-s7aMH90qVVpXl15b9zzsytfKd0,170
1975
1975
  py2docfx/venv/venv1/Lib/site-packages/azure/identity/_credentials/__init__.py,sha256=HiD0uRVJ7Okw8ICCzWrMWKeEvf2RUa3DuwdDUgIxg5s,1756
1976
1976
  py2docfx/venv/venv1/Lib/site-packages/azure/identity/_credentials/app_service.py,sha256=mc0GqUWXLjcgkZX64IV3aVmJd1M1-fo5h6ssVe0Iklo,1424
1977
1977
  py2docfx/venv/venv1/Lib/site-packages/azure/identity/_credentials/application.py,sha256=Ew2pypi9Z81E0xLoROEyX0IUlnYG_e4p1NJ3OckNHpM,6435
1978
- py2docfx/venv/venv1/Lib/site-packages/azure/identity/_credentials/authorization_code.py,sha256=Xb2QIAP-ucqUdIVs5p7KvK6TtoQRkHE7j00g9D9w6Qg,7266
1979
- py2docfx/venv/venv1/Lib/site-packages/azure/identity/_credentials/azd_cli.py,sha256=shd5NvYL2yuAon62CBriVxWVBHiR0Wf9Zt92hfElHO8,12293
1980
- py2docfx/venv/venv1/Lib/site-packages/azure/identity/_credentials/azure_arc.py,sha256=v9_Ut5EAGCR15_MNKwzQgBGUdJIQur71iUmu1Ij-2rg,4938
1981
- py2docfx/venv/venv1/Lib/site-packages/azure/identity/_credentials/azure_cli.py,sha256=BKJK4OnSMlAsi6vAYjwCx3ofn41ylhuB_2z-XtsYo5s,10597
1978
+ py2docfx/venv/venv1/Lib/site-packages/azure/identity/_credentials/authorization_code.py,sha256=ZmdEIn710IqPXSeVNzgdHc9IZ-XrN8krZFhp3KYnAzM,7217
1979
+ py2docfx/venv/venv1/Lib/site-packages/azure/identity/_credentials/azd_cli.py,sha256=KcUoPaJaftVTL6-7r0f1W7L1D2Ds3dEb6JCWJjoNDA0,12440
1980
+ py2docfx/venv/venv1/Lib/site-packages/azure/identity/_credentials/azure_arc.py,sha256=2B5SYKKGIEg8y8kC_zccSspxqVllKrIgP4WF_WD9ky0,4907
1981
+ py2docfx/venv/venv1/Lib/site-packages/azure/identity/_credentials/azure_cli.py,sha256=ypx8tGKbPRVE7oOXOQQn73uUeMfuDhkaSrU0RTYTVLo,11275
1982
1982
  py2docfx/venv/venv1/Lib/site-packages/azure/identity/_credentials/azure_ml.py,sha256=qLMRTkkecgZRwA6HoXf-9GoEp0HddbPoYioBcWYwOF4,3000
1983
1983
  py2docfx/venv/venv1/Lib/site-packages/azure/identity/_credentials/azure_pipelines.py,sha256=xbWqDL0SAM84C_sunvPBQ1fMN8pS3iIdprwmZEa_rLs,8542
1984
- py2docfx/venv/venv1/Lib/site-packages/azure/identity/_credentials/azure_powershell.py,sha256=pyDgskwj-SMrkFlv2pGGRETACaibktcESIjk9VpwuSk,10960
1984
+ py2docfx/venv/venv1/Lib/site-packages/azure/identity/_credentials/azure_powershell.py,sha256=dp-k5ydDPn7gt1kqzr7fWN4YdBqm3F-P29-hRuM47p8,10929
1985
1985
  py2docfx/venv/venv1/Lib/site-packages/azure/identity/_credentials/browser.py,sha256=mkkIqHvkNPYwqcPHRQscx_qtQWDpf0TNBuxVu2ynf6Q,8307
1986
1986
  py2docfx/venv/venv1/Lib/site-packages/azure/identity/_credentials/certificate.py,sha256=uHVCvvdcjkIuamb_66ANHh6TVQAO9lUhcSjxr4J2V-0,9179
1987
- py2docfx/venv/venv1/Lib/site-packages/azure/identity/_credentials/chained.py,sha256=qL6PiByXTEQqRB7hRzxDFNJEmB2YI7OXsgMo7mBe8Ho,9975
1987
+ py2docfx/venv/venv1/Lib/site-packages/azure/identity/_credentials/chained.py,sha256=FQO13rzJxthtCrlJzR-4HwMP4S7m1yMza0GbjiDxP1E,10015
1988
1988
  py2docfx/venv/venv1/Lib/site-packages/azure/identity/_credentials/client_assertion.py,sha256=cMzxMC46PU0RxWaYjjQ7pdSO6MDaXuaWBN3ZzCfhakY,3434
1989
1989
  py2docfx/venv/venv1/Lib/site-packages/azure/identity/_credentials/client_secret.py,sha256=U4d2uOTMfXCfjTBtZLpM1_uvVDSqQgtfPlMx88oqO_8,3114
1990
1990
  py2docfx/venv/venv1/Lib/site-packages/azure/identity/_credentials/cloud_shell.py,sha256=yyuxWKBM8cp0EI6IbVuGP2LvXfkidV0se5NABBuMH7k,1928
1991
- py2docfx/venv/venv1/Lib/site-packages/azure/identity/_credentials/default.py,sha256=EJTiNykFRAVZg9wqnNZbJUYl3KxzWBg0zN6sMfferRY,15236
1991
+ py2docfx/venv/venv1/Lib/site-packages/azure/identity/_credentials/default.py,sha256=1HM5XNFhDWpF-44_TqprGyt5hGq1ytSkG6WTaijq-6A,15323
1992
1992
  py2docfx/venv/venv1/Lib/site-packages/azure/identity/_credentials/device_code.py,sha256=DXW99i6FiKJ1EeTbqMqLbRZW8zpHpJkuyURHSe56i8E,6763
1993
1993
  py2docfx/venv/venv1/Lib/site-packages/azure/identity/_credentials/environment.py,sha256=uI3hrPNKdgVxNb1r6-Imaa__30o0nmOGb8VID8QzUR0,9511
1994
- py2docfx/venv/venv1/Lib/site-packages/azure/identity/_credentials/imds.py,sha256=9a_94xDWXdMqRGQsCJi4PJySNdOtWnpcb74yiX0S8dw,5612
1995
- py2docfx/venv/venv1/Lib/site-packages/azure/identity/_credentials/managed_identity.py,sha256=D0X_0cGNz8MfFsSbx_8OD_qHHU66ZmHzJx24yqE9GvY,9643
1994
+ py2docfx/venv/venv1/Lib/site-packages/azure/identity/_credentials/imds.py,sha256=3-qDYPz5TH38Uamjb1ZxdUPo-V5FlsOLJMJMg5w3GDY,5550
1995
+ py2docfx/venv/venv1/Lib/site-packages/azure/identity/_credentials/managed_identity.py,sha256=3sr0wbxGUw2lvJXP25V_APV1yuL3zdc2euMKJdxPB1k,9654
1996
1996
  py2docfx/venv/venv1/Lib/site-packages/azure/identity/_credentials/on_behalf_of.py,sha256=e8av70lj1hwwqrQc7bX1MI5bH5OWsZA6LZvy1ib_M4U,9014
1997
1997
  py2docfx/venv/venv1/Lib/site-packages/azure/identity/_credentials/service_fabric.py,sha256=t2ir_-JJi4krqOa6TqwbiU7vosIZP3_mN0GrQ-sABsc,1454
1998
1998
  py2docfx/venv/venv1/Lib/site-packages/azure/identity/_credentials/shared_cache.py,sha256=kqlEMbHJb1Ky2Whnuwn72N1EjpaEAxW45cCsq72R5Ek,8997
@@ -2000,26 +2000,26 @@ py2docfx/venv/venv1/Lib/site-packages/azure/identity/_credentials/silent.py,sha2
2000
2000
  py2docfx/venv/venv1/Lib/site-packages/azure/identity/_credentials/user_password.py,sha256=x92tkv7xe-YK-mbM0QBFu0kaHShuMHRZusZs8ByxoSI,4556
2001
2001
  py2docfx/venv/venv1/Lib/site-packages/azure/identity/_credentials/vscode.py,sha256=39g07fYproZ8QR5klBXBNR0p70sClTJOTfrup7EPRDI,10986
2002
2002
  py2docfx/venv/venv1/Lib/site-packages/azure/identity/_credentials/workload_identity.py,sha256=hxVmnqh8lqJ6hfmkgBfU84Au34_KaJ_S6zrtyPlCAqg,4378
2003
- py2docfx/venv/venv1/Lib/site-packages/azure/identity/_internal/__init__.py,sha256=HXsYuUMiHAXz2n4xF3tnPpRQsQWO36m8wU1bOsOU64Y,1530
2003
+ py2docfx/venv/venv1/Lib/site-packages/azure/identity/_internal/__init__.py,sha256=bZ5LRc-OWVx1WTrL4gPzz6BUrjlZbSC0nvcY_JUJ1uU,1586
2004
2004
  py2docfx/venv/venv1/Lib/site-packages/azure/identity/_internal/aad_client.py,sha256=O8b9pnlc6HIRdV0YqrCjYaMOt1z8mYKPE4bOdrYtR-Q,3299
2005
2005
  py2docfx/venv/venv1/Lib/site-packages/azure/identity/_internal/aad_client_base.py,sha256=5CZE19MJAyFmdGShM-S-RxPYGWCEhbj53uMZyMas5jo,16675
2006
2006
  py2docfx/venv/venv1/Lib/site-packages/azure/identity/_internal/aadclient_certificate.py,sha256=bURwToOkDTu1C1R-wgDltfDQpmeioQxmMl__Xq64H4g,1890
2007
- py2docfx/venv/venv1/Lib/site-packages/azure/identity/_internal/auth_code_redirect_handler.py,sha256=He_YalvJ4O6-URVZbVMV1RCIgVh2ASKce6kUaIXW7nE,2304
2007
+ py2docfx/venv/venv1/Lib/site-packages/azure/identity/_internal/auth_code_redirect_handler.py,sha256=E4rQw6AvhEDS_CcBOX_dzNPtfcUGp1WXpLO2kK8QFHc,2288
2008
2008
  py2docfx/venv/venv1/Lib/site-packages/azure/identity/_internal/client_credential_base.py,sha256=YBEnqgTBOebvSoTaCY20qt3ue7_ovK4i0O_HyX_pC3E,2508
2009
- py2docfx/venv/venv1/Lib/site-packages/azure/identity/_internal/decorators.py,sha256=ibtW1BfVLZAMABYqMx5kbnIQV2YfoVhDPoLbDqkNTqo,2613
2009
+ py2docfx/venv/venv1/Lib/site-packages/azure/identity/_internal/decorators.py,sha256=uM-aP4FsVYT2aR1BX41kdvHHs83XxB-O0vYzRq3YUw4,2877
2010
2010
  py2docfx/venv/venv1/Lib/site-packages/azure/identity/_internal/get_token_mixin.py,sha256=WTre9ydKPvucT3NySXpqpoOaGKFANk3lYeoong08_3s,7290
2011
- py2docfx/venv/venv1/Lib/site-packages/azure/identity/_internal/interactive.py,sha256=lYjga9eQC6sfkUE-ogKiNDTXG_-ubhS-K1XGR_3ZeoQ,13879
2011
+ py2docfx/venv/venv1/Lib/site-packages/azure/identity/_internal/interactive.py,sha256=jmllrTE15PjhJAp81ghmljVtrh3Ps5qayUbBL08e_yk,13848
2012
2012
  py2docfx/venv/venv1/Lib/site-packages/azure/identity/_internal/linux_vscode_adapter.py,sha256=LL2ImHX7IzfSwOQ0BuvOrQ1do_X6fo_o3b3r4O77nI8,2952
2013
2013
  py2docfx/venv/venv1/Lib/site-packages/azure/identity/_internal/macos_vscode_adapter.py,sha256=sRcYxS_xaiSaRmruqUH3_wXmDA6BWRACXNs8dnvBkNw,1202
2014
2014
  py2docfx/venv/venv1/Lib/site-packages/azure/identity/_internal/managed_identity_base.py,sha256=pBEoUq39MElBnuvqwEAsjco2I4wznp3nxwgDkW5qiPo,2416
2015
- py2docfx/venv/venv1/Lib/site-packages/azure/identity/_internal/managed_identity_client.py,sha256=m5GFexmmpbVOcds5RkWUM9oTgMzPGDXHHRkb2odDEEo,6051
2016
- py2docfx/venv/venv1/Lib/site-packages/azure/identity/_internal/msal_client.py,sha256=3RK2q_R8tOHx7ZhsHYjOOqpks7jByP6RoCg7hpyn2F0,5804
2015
+ py2docfx/venv/venv1/Lib/site-packages/azure/identity/_internal/managed_identity_client.py,sha256=mWD_pDAjsFaUUdiVo5oupe9jt8mCEzraNs0_Wtha8_g,5982
2016
+ py2docfx/venv/venv1/Lib/site-packages/azure/identity/_internal/msal_client.py,sha256=NdISdFIBe4bzmq4jEYaYurUEOHYUnZnZ6vVBuT8JFfU,5783
2017
2017
  py2docfx/venv/venv1/Lib/site-packages/azure/identity/_internal/msal_credentials.py,sha256=xP3qVooz7zqr94j0vAho3qY_-jSwNpse-HQAPKyMZdY,6041
2018
- py2docfx/venv/venv1/Lib/site-packages/azure/identity/_internal/msal_managed_identity_client.py,sha256=wVYLjUwRydraiGGhxkgx3AHe9nnP8Arz34l72MKGqzw,9702
2018
+ py2docfx/venv/venv1/Lib/site-packages/azure/identity/_internal/msal_managed_identity_client.py,sha256=rd8rRTye492y940_rUJLUgFBeMaKOBUDBa0NTUuDvjg,9695
2019
2019
  py2docfx/venv/venv1/Lib/site-packages/azure/identity/_internal/pipeline.py,sha256=Zv7bjJhbKKq3bemZV_PRRTf0UZnIO9QtoO7ID-1-OIs,2867
2020
- py2docfx/venv/venv1/Lib/site-packages/azure/identity/_internal/shared_token_cache.py,sha256=IvtSgbftiGxn2OaJd2rfbcqWD8_fB8mZoqX8cDGt-yM,12651
2020
+ py2docfx/venv/venv1/Lib/site-packages/azure/identity/_internal/shared_token_cache.py,sha256=Q4sGmpQrrxWu0yXRuZ66ndqxa8CjHORvTp2Suegz2sY,12555
2021
2021
  py2docfx/venv/venv1/Lib/site-packages/azure/identity/_internal/user_agent.py,sha256=aOlTYL7cTqLLoRppt0oKao64YtYnUrw6BAfDc9pghZg,319
2022
- py2docfx/venv/venv1/Lib/site-packages/azure/identity/_internal/utils.py,sha256=FG7JRELDXjZWarWs334XowADv7zey6fFJswpQ0Ax5vA,4827
2022
+ py2docfx/venv/venv1/Lib/site-packages/azure/identity/_internal/utils.py,sha256=V4p1qdKBh8tenSjsgXHcJhXws4t9Hq_TsqXEPX2Vbuc,5679
2023
2023
  py2docfx/venv/venv1/Lib/site-packages/azure/identity/_internal/win_vscode_adapter.py,sha256=XM3JW1YeY9-4p3aauJThbBKVdmQ-RD-pzaAFrS8QhOc,2444
2024
2024
  py2docfx/venv/venv1/Lib/site-packages/azure/identity/aio/__init__.py,sha256=sXPK0GJ7WNbMWQaTvbG1SXa2riULBZvayDTlLRzTosY,1325
2025
2025
  py2docfx/venv/venv1/Lib/site-packages/azure/identity/aio/_bearer_token_provider.py,sha256=2vUCmdarROmCg_tIuY20SIVP5J7NIO-spprGLrt7TDE,1783
@@ -2027,9 +2027,9 @@ py2docfx/venv/venv1/Lib/site-packages/azure/identity/aio/_credentials/__init__.p
2027
2027
  py2docfx/venv/venv1/Lib/site-packages/azure/identity/aio/_credentials/app_service.py,sha256=xb8LIoDfAdCZj60CiaKtdjUDLecNbLfkuC9Xy1ItwuE,836
2028
2028
  py2docfx/venv/venv1/Lib/site-packages/azure/identity/aio/_credentials/application.py,sha256=vflikwr_RbG7UJaeMiSO7XxlgnAZr8hR_9thacNh7CQ,6539
2029
2029
  py2docfx/venv/venv1/Lib/site-packages/azure/identity/aio/_credentials/authorization_code.py,sha256=05qyzHrEgo2EroIgrZz3af0T8H9AC3jod2TaIR1DTD0,7401
2030
- py2docfx/venv/venv1/Lib/site-packages/azure/identity/aio/_credentials/azd_cli.py,sha256=iEMyshfHeZNvqAAd3HtPn3A21gXqHrFdbRTW143hoyA,10874
2030
+ py2docfx/venv/venv1/Lib/site-packages/azure/identity/aio/_credentials/azd_cli.py,sha256=TiCwnuluniSH9yyZ1ifbW2dpYJ8qYjHPnVVvYzjqRqc,10975
2031
2031
  py2docfx/venv/venv1/Lib/site-packages/azure/identity/aio/_credentials/azure_arc.py,sha256=ottnsKp-t7mpUXrn1I_TtgHKqT75WsZR5qGMkz7_mF0,1857
2032
- py2docfx/venv/venv1/Lib/site-packages/azure/identity/aio/_credentials/azure_cli.py,sha256=INyGyfulvX0m_0MG4ixW9tM9mzsmPgAgd-QvF7LMXOM,9340
2032
+ py2docfx/venv/venv1/Lib/site-packages/azure/identity/aio/_credentials/azure_cli.py,sha256=iUsXxt-nXvY2rXYE08blaSSu7FFgK6ys26cmgPx1yro,9902
2033
2033
  py2docfx/venv/venv1/Lib/site-packages/azure/identity/aio/_credentials/azure_ml.py,sha256=D7hQWuNLFHQb60Za5cXFeAK7aRT5ta0i8banjc4j0tQ,827
2034
2034
  py2docfx/venv/venv1/Lib/site-packages/azure/identity/aio/_credentials/azure_pipelines.py,sha256=FHVId296gbLEIXgBWYiXThMx0_W0lQB6-3LMyrkBa9U,7434
2035
2035
  py2docfx/venv/venv1/Lib/site-packages/azure/identity/aio/_credentials/azure_powershell.py,sha256=zmmW6n5KwtNphkAHex0rg7IOx8i0qzXYIq-NSBdJWng,8693
@@ -2038,10 +2038,10 @@ py2docfx/venv/venv1/Lib/site-packages/azure/identity/aio/_credentials/chained.py
2038
2038
  py2docfx/venv/venv1/Lib/site-packages/azure/identity/aio/_credentials/client_assertion.py,sha256=f46y6n1fMTTBaEZaMc9Dux7TwcSwGXkQq4pScLf8Jic,3511
2039
2039
  py2docfx/venv/venv1/Lib/site-packages/azure/identity/aio/_credentials/client_secret.py,sha256=JHI9N_0qzvKpV_RvMMjChfnPMRtbPb7FF_n6GIVnKRk,3218
2040
2040
  py2docfx/venv/venv1/Lib/site-packages/azure/identity/aio/_credentials/cloud_shell.py,sha256=jJ4b3hacR-Mzk3vcwvzbxwF4DrN60uyHv1BIhUzD3bA,1225
2041
- py2docfx/venv/venv1/Lib/site-packages/azure/identity/aio/_credentials/default.py,sha256=F6eTWoYICiois8tNefDNn2-tV5k-UIcYKF4ih_Pvcks,13970
2041
+ py2docfx/venv/venv1/Lib/site-packages/azure/identity/aio/_credentials/default.py,sha256=wSDNeR94ISWuwaDSHzkOsAqyYp0yQ883tqgIHqqOdtk,13964
2042
2042
  py2docfx/venv/venv1/Lib/site-packages/azure/identity/aio/_credentials/environment.py,sha256=1Duguy5dyhWKx4_vwwH2NMQyiBTPWQsWWy_u5auiRUA,7923
2043
- py2docfx/venv/venv1/Lib/site-packages/azure/identity/aio/_credentials/imds.py,sha256=tW45TFr-_QLb_RSUBBtwrJgJ6G-v1jzrzwHoe4R-xvA,4174
2044
- py2docfx/venv/venv1/Lib/site-packages/azure/identity/aio/_credentials/managed_identity.py,sha256=tFJVyfeVEGPCzloyQMdrxVgg9_7wbiVq7R3Ozz2CIMI,9023
2043
+ py2docfx/venv/venv1/Lib/site-packages/azure/identity/aio/_credentials/imds.py,sha256=IsANbJ1R8JbJ7OAlUa2sy6rXfnT51goG49gIAahNfug,4078
2044
+ py2docfx/venv/venv1/Lib/site-packages/azure/identity/aio/_credentials/managed_identity.py,sha256=gj37QkYZtNJLi0b19b-9CGYy_Z12JNwCVAoJCKgNTfw,9034
2045
2045
  py2docfx/venv/venv1/Lib/site-packages/azure/identity/aio/_credentials/on_behalf_of.py,sha256=M6kn3uC-04wywCl9KpuYX1VvFJJBIfIT25TllDhxgzA,7300
2046
2046
  py2docfx/venv/venv1/Lib/site-packages/azure/identity/aio/_credentials/service_fabric.py,sha256=15SUsJiLD29uKgYLeHJgh0EJumCYuM3TYx-JXe-IzOc,845
2047
2047
  py2docfx/venv/venv1/Lib/site-packages/azure/identity/aio/_credentials/shared_cache.py,sha256=_soM-tNKtnmvZ8bbNxyz1tsyR7CTgH2tknbdxFa_rbk,7410
@@ -2049,10 +2049,10 @@ py2docfx/venv/venv1/Lib/site-packages/azure/identity/aio/_credentials/vscode.py,
2049
2049
  py2docfx/venv/venv1/Lib/site-packages/azure/identity/aio/_credentials/workload_identity.py,sha256=6kvXuQKxiIFWqEgW6qJdoB6eo3bqctmlfI2T63h0Fqs,3896
2050
2050
  py2docfx/venv/venv1/Lib/site-packages/azure/identity/aio/_internal/__init__.py,sha256=kqVXG7igSXSP_Gi4MzJPHoXaudlQV18A7U1qNEvXeMM,838
2051
2051
  py2docfx/venv/venv1/Lib/site-packages/azure/identity/aio/_internal/aad_client.py,sha256=nDPSqqrFjtmm5xWLc7exa3aWxDvhwwge8yEZ__5ZtrQ,4260
2052
- py2docfx/venv/venv1/Lib/site-packages/azure/identity/aio/_internal/decorators.py,sha256=15HzDYdtirwkos7kY9wpMBg0gbRmzD5wDm2lcDwxMLg,2676
2052
+ py2docfx/venv/venv1/Lib/site-packages/azure/identity/aio/_internal/decorators.py,sha256=aw8JChj6khlmXPkjbMtypcvUgwfyIiUlUF1227nFREI,2940
2053
2053
  py2docfx/venv/venv1/Lib/site-packages/azure/identity/aio/_internal/get_token_mixin.py,sha256=lcTyehjuQ3ztNNZHw6pGnE8AQgm-3fgpru1PzGyMTBg,7347
2054
2054
  py2docfx/venv/venv1/Lib/site-packages/azure/identity/aio/_internal/managed_identity_base.py,sha256=-F_2QCSSM-WSk_BrGYV_6chvLeF-uZ0XOoANWK_HK84,2735
2055
- py2docfx/venv/venv1/Lib/site-packages/azure/identity/aio/_internal/managed_identity_client.py,sha256=yQG3iTFO9edoi7H99gY4Lf8RHc4t4R_pN-OTmH5X17c,1562
2055
+ py2docfx/venv/venv1/Lib/site-packages/azure/identity/aio/_internal/managed_identity_client.py,sha256=5WhFml6NNwDWKWy60H_GfX34gedwgdk9ogxwl1bT_1A,1514
2056
2056
  py2docfx/venv/venv1/Lib/site-packages/cachetools/__init__.py,sha256=8FSISszrQC5dE0HjoiivM7z9Azm8cEo3uX4rwzDdlf0,25557
2057
2057
  py2docfx/venv/venv1/Lib/site-packages/cachetools/func.py,sha256=aOVfSkuNWMRADpkHZGK7LeJ_VZ8wljzbRwIAliOuhAg,3719
2058
2058
  py2docfx/venv/venv1/Lib/site-packages/cachetools/keys.py,sha256=AOgfoi-oioBOnEEk115_9qs0HKISrYnbcV4F0hyZ1yk,1777
@@ -2089,7 +2089,7 @@ py2docfx/venv/venv1/Lib/site-packages/charset_normalizer/utils.py,sha256=oH9Q3Wc
2089
2089
  py2docfx/venv/venv1/Lib/site-packages/charset_normalizer/version.py,sha256=7_thI7FzRQxEsbtUYwrJs3FCFWF666mw74H8mggPRR0,123
2090
2090
  py2docfx/venv/venv1/Lib/site-packages/charset_normalizer/cli/__init__.py,sha256=d9MUx-1V_qD3x9igIy4JT4oC5CU0yjulk7QyZWeRFhg,144
2091
2091
  py2docfx/venv/venv1/Lib/site-packages/charset_normalizer/cli/__main__.py,sha256=lZ89qRWun7FRxX0qm1GhK-m0DH0i048yiMAX1mVIuRg,10731
2092
- py2docfx/venv/venv1/Lib/site-packages/cryptography/__about__.py,sha256=fcUqF1IcadxBSH0us1vCvob0OJOrPV3h30yZD8wsHo4,445
2092
+ py2docfx/venv/venv1/Lib/site-packages/cryptography/__about__.py,sha256=7_pvWpkU4M2C1cgTcHSQPw8Az1RaaIZ9nJ7gD7P4I30,445
2093
2093
  py2docfx/venv/venv1/Lib/site-packages/cryptography/__init__.py,sha256=XsRL_PxbU6UgoyoglAgJQSrJCP97ovBA8YIEQ2-uI68,762
2094
2094
  py2docfx/venv/venv1/Lib/site-packages/cryptography/exceptions.py,sha256=835EWILc2fwxw-gyFMriciC2SqhViETB10LBSytnDIc,1087
2095
2095
  py2docfx/venv/venv1/Lib/site-packages/cryptography/fernet.py,sha256=aMU2HyDJ5oRGjg8AkFvHwE7BSmHY4fVUCaioxZcd8gA,6933
@@ -4193,7 +4193,7 @@ py2docfx/venv/venv1/Lib/site-packages/win32comext/taskscheduler/test/test_addtas
4193
4193
  py2docfx/venv/venv1/Lib/site-packages/win32comext/taskscheduler/test/test_localsystem.py,sha256=08ojAS48W6RLsUbRD45j0SJhg_Y2NFHZT6qjT4Vrig0,75
4194
4194
  py2docfx/venv/venv1/Scripts/pywin32_postinstall.py,sha256=u95n7QQUxpCjrZistYE-3gN451zXzopuJna8cXRQ4Jw,28115
4195
4195
  py2docfx/venv/venv1/Scripts/pywin32_testall.py,sha256=-6yvZmd2lPQc4e8i6PgLsr_totF6mScvoq0Jqr0V2fM,3844
4196
- py2docfx-0.1.11.dev1987375.dist-info/METADATA,sha256=APuVO3-KrZFlCm4q9jgcwFBLC1jHz9uVYkswsLhYuZ0,601
4197
- py2docfx-0.1.11.dev1987375.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
4198
- py2docfx-0.1.11.dev1987375.dist-info/top_level.txt,sha256=5dH2uP81dczt_qQJ38wiZ-gzoVWasfiJALWRSjdbnYU,9
4199
- py2docfx-0.1.11.dev1987375.dist-info/RECORD,,
4196
+ py2docfx-0.1.11.dev1989123.dist-info/METADATA,sha256=vCwJ-f8nckfA2IU-16BEVWPS0ykGLSIDCGRbTHQFGlE,601
4197
+ py2docfx-0.1.11.dev1989123.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
4198
+ py2docfx-0.1.11.dev1989123.dist-info/top_level.txt,sha256=5dH2uP81dczt_qQJ38wiZ-gzoVWasfiJALWRSjdbnYU,9
4199
+ py2docfx-0.1.11.dev1989123.dist-info/RECORD,,