py2docfx 0.1.16.dev2064350__py3-none-any.whl → 0.1.17__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 (388) hide show
  1. py2docfx/convert_prepare/environment.py +1 -3
  2. py2docfx/convert_prepare/get_source.py +1 -6
  3. py2docfx/convert_prepare/package_info.py +1 -1
  4. py2docfx/docfx_yaml/miss_reference.py +1 -1
  5. py2docfx/docfx_yaml/parameter_utils.py +58 -6
  6. py2docfx/docfx_yaml/tests/roots/test-translator-typing/code_with_typing.py +14 -0
  7. py2docfx/docfx_yaml/tests/roots/test-translator-typing/conf.py +18 -0
  8. py2docfx/docfx_yaml/tests/test_translator_typing.py +39 -0
  9. py2docfx/docfx_yaml/utils.py +2 -2
  10. py2docfx/venv/basevenv/Lib/site-packages/certifi/__init__.py +1 -1
  11. py2docfx/venv/basevenv/Lib/site-packages/certifi/core.py +1 -32
  12. py2docfx/venv/basevenv/Lib/site-packages/charset_normalizer/cli/__main__.py +62 -2
  13. py2docfx/venv/basevenv/Lib/site-packages/charset_normalizer/constant.py +17 -0
  14. py2docfx/venv/basevenv/Lib/site-packages/charset_normalizer/legacy.py +1 -3
  15. py2docfx/venv/basevenv/Lib/site-packages/charset_normalizer/md.py +19 -14
  16. py2docfx/venv/basevenv/Lib/site-packages/charset_normalizer/utils.py +6 -0
  17. py2docfx/venv/basevenv/Lib/site-packages/charset_normalizer/version.py +1 -1
  18. py2docfx/venv/basevenv/Lib/site-packages/packaging/__init__.py +1 -1
  19. py2docfx/venv/basevenv/Lib/site-packages/packaging/_elffile.py +1 -2
  20. py2docfx/venv/basevenv/Lib/site-packages/packaging/_manylinux.py +1 -2
  21. py2docfx/venv/basevenv/Lib/site-packages/packaging/_parser.py +1 -2
  22. py2docfx/venv/basevenv/Lib/site-packages/packaging/_tokenizer.py +5 -4
  23. py2docfx/venv/basevenv/Lib/site-packages/packaging/licenses/__init__.py +1 -1
  24. py2docfx/venv/basevenv/Lib/site-packages/packaging/markers.py +53 -22
  25. py2docfx/venv/basevenv/Lib/site-packages/packaging/metadata.py +1 -2
  26. py2docfx/venv/basevenv/Lib/site-packages/packaging/specifiers.py +1 -2
  27. py2docfx/venv/basevenv/Lib/site-packages/packaging/tags.py +39 -0
  28. py2docfx/venv/basevenv/Lib/site-packages/pkg_resources/__init__.py +6 -7
  29. py2docfx/venv/basevenv/Lib/site-packages/pygments/__init__.py +1 -1
  30. py2docfx/venv/basevenv/Lib/site-packages/pygments/lexers/_sql_builtins.py +106 -0
  31. py2docfx/venv/basevenv/Lib/site-packages/pygments/lexers/scripting.py +5 -3
  32. py2docfx/venv/basevenv/Lib/site-packages/pygments/lexers/sql.py +24 -118
  33. py2docfx/venv/basevenv/Lib/site-packages/requests/__version__.py +2 -2
  34. py2docfx/venv/basevenv/Lib/site-packages/requests/compat.py +12 -0
  35. py2docfx/venv/basevenv/Lib/site-packages/requests/models.py +3 -1
  36. py2docfx/venv/basevenv/Lib/site-packages/requests/utils.py +6 -16
  37. py2docfx/venv/basevenv/Lib/site-packages/setuptools/__init__.py +0 -38
  38. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_discovery.py +33 -0
  39. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_distutils/command/build_scripts.py +1 -1
  40. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_distutils/command/config.py +0 -2
  41. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_distutils/compilers/C/tests/test_unix.py +63 -0
  42. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_distutils/compilers/C/unix.py +5 -6
  43. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_entry_points.py +4 -0
  44. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_normalization.py +0 -2
  45. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_path.py +12 -3
  46. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_reqs.py +1 -1
  47. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_scripts.py +361 -0
  48. py2docfx/venv/basevenv/Lib/site-packages/setuptools/_shutil.py +6 -0
  49. py2docfx/venv/basevenv/Lib/site-packages/setuptools/build_meta.py +25 -37
  50. py2docfx/venv/basevenv/Lib/site-packages/setuptools/command/bdist_egg.py +9 -11
  51. py2docfx/venv/basevenv/Lib/site-packages/setuptools/command/bdist_wheel.py +1 -1
  52. py2docfx/venv/basevenv/Lib/site-packages/setuptools/command/build_ext.py +29 -28
  53. py2docfx/venv/basevenv/Lib/site-packages/setuptools/command/develop.py +39 -179
  54. py2docfx/venv/basevenv/Lib/site-packages/setuptools/command/easy_install.py +17 -2352
  55. py2docfx/venv/basevenv/Lib/site-packages/setuptools/command/editable_wheel.py +14 -31
  56. py2docfx/venv/basevenv/Lib/site-packages/setuptools/command/egg_info.py +0 -2
  57. py2docfx/venv/basevenv/Lib/site-packages/setuptools/command/install.py +3 -55
  58. py2docfx/venv/basevenv/Lib/site-packages/setuptools/command/install_scripts.py +5 -11
  59. py2docfx/venv/basevenv/Lib/site-packages/setuptools/command/sdist.py +1 -1
  60. py2docfx/venv/basevenv/Lib/site-packages/setuptools/compat/py310.py +11 -0
  61. py2docfx/venv/basevenv/Lib/site-packages/setuptools/dist.py +10 -12
  62. py2docfx/venv/basevenv/Lib/site-packages/setuptools/installer.py +34 -29
  63. py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/contexts.py +0 -14
  64. py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/fixtures.py +235 -0
  65. py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/integration/test_pbr.py +20 -0
  66. py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/test_build_meta.py +0 -24
  67. py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/test_develop.py +1 -64
  68. py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/test_dist.py +2 -2
  69. py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/test_dist_info.py +0 -63
  70. py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/test_editable_install.py +15 -41
  71. py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/test_egg_info.py +3 -2
  72. py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/test_scripts.py +12 -0
  73. py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/test_wheel.py +12 -36
  74. py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/test_windows_wrappers.py +3 -4
  75. py2docfx/venv/basevenv/Lib/site-packages/setuptools/wheel.py +49 -24
  76. py2docfx/venv/basevenv/Lib/site-packages/snowballstemmer/__init__.py +6 -0
  77. py2docfx/venv/basevenv/Lib/site-packages/snowballstemmer/arabic_stemmer.py +798 -797
  78. py2docfx/venv/basevenv/Lib/site-packages/snowballstemmer/armenian_stemmer.py +212 -213
  79. py2docfx/venv/basevenv/Lib/site-packages/snowballstemmer/basestemmer.py +20 -54
  80. py2docfx/venv/basevenv/Lib/site-packages/snowballstemmer/basque_stemmer.py +202 -228
  81. py2docfx/venv/basevenv/Lib/site-packages/snowballstemmer/catalan_stemmer.py +370 -375
  82. py2docfx/venv/basevenv/Lib/site-packages/snowballstemmer/danish_stemmer.py +63 -61
  83. py2docfx/venv/basevenv/Lib/site-packages/snowballstemmer/dutch_porter_stemmer.py +466 -0
  84. py2docfx/venv/basevenv/Lib/site-packages/snowballstemmer/dutch_stemmer.py +1217 -343
  85. py2docfx/venv/basevenv/Lib/site-packages/snowballstemmer/english_stemmer.py +295 -264
  86. py2docfx/venv/basevenv/Lib/site-packages/snowballstemmer/esperanto_stemmer.py +588 -0
  87. py2docfx/venv/basevenv/Lib/site-packages/snowballstemmer/estonian_stemmer.py +850 -0
  88. py2docfx/venv/basevenv/Lib/site-packages/snowballstemmer/finnish_stemmer.py +144 -143
  89. py2docfx/venv/basevenv/Lib/site-packages/snowballstemmer/french_stemmer.py +308 -246
  90. py2docfx/venv/basevenv/Lib/site-packages/snowballstemmer/german_stemmer.py +224 -167
  91. py2docfx/venv/basevenv/Lib/site-packages/snowballstemmer/greek_stemmer.py +1314 -1313
  92. py2docfx/venv/basevenv/Lib/site-packages/snowballstemmer/hindi_stemmer.py +39 -38
  93. py2docfx/venv/basevenv/Lib/site-packages/snowballstemmer/hungarian_stemmer.py +231 -256
  94. py2docfx/venv/basevenv/Lib/site-packages/snowballstemmer/indonesian_stemmer.py +61 -64
  95. py2docfx/venv/basevenv/Lib/site-packages/snowballstemmer/irish_stemmer.py +101 -106
  96. py2docfx/venv/basevenv/Lib/site-packages/snowballstemmer/italian_stemmer.py +272 -272
  97. py2docfx/venv/basevenv/Lib/site-packages/snowballstemmer/lithuanian_stemmer.py +233 -240
  98. py2docfx/venv/basevenv/Lib/site-packages/snowballstemmer/nepali_stemmer.py +108 -134
  99. py2docfx/venv/basevenv/Lib/site-packages/snowballstemmer/norwegian_stemmer.py +108 -63
  100. py2docfx/venv/basevenv/Lib/site-packages/snowballstemmer/porter_stemmer.py +101 -108
  101. py2docfx/venv/basevenv/Lib/site-packages/snowballstemmer/portuguese_stemmer.py +241 -250
  102. py2docfx/venv/basevenv/Lib/site-packages/snowballstemmer/romanian_stemmer.py +332 -296
  103. py2docfx/venv/basevenv/Lib/site-packages/snowballstemmer/russian_stemmer.py +178 -179
  104. py2docfx/venv/basevenv/Lib/site-packages/snowballstemmer/serbian_stemmer.py +2331 -2332
  105. py2docfx/venv/basevenv/Lib/site-packages/snowballstemmer/spanish_stemmer.py +254 -259
  106. py2docfx/venv/basevenv/Lib/site-packages/snowballstemmer/swedish_stemmer.py +143 -70
  107. py2docfx/venv/basevenv/Lib/site-packages/snowballstemmer/tamil_stemmer.py +638 -1491
  108. py2docfx/venv/basevenv/Lib/site-packages/snowballstemmer/turkish_stemmer.py +326 -292
  109. py2docfx/venv/basevenv/Lib/site-packages/snowballstemmer/yiddish_stemmer.py +245 -246
  110. py2docfx/venv/basevenv/Lib/site-packages/urllib3/_version.py +2 -2
  111. py2docfx/venv/basevenv/Lib/site-packages/urllib3/connection.py +87 -38
  112. py2docfx/venv/basevenv/Lib/site-packages/urllib3/contrib/emscripten/fetch.py +20 -0
  113. py2docfx/venv/basevenv/Lib/site-packages/urllib3/poolmanager.py +17 -1
  114. py2docfx/venv/basevenv/Lib/site-packages/urllib3/response.py +53 -24
  115. py2docfx/venv/basevenv/Lib/site-packages/urllib3/util/request.py +12 -4
  116. py2docfx/venv/basevenv/Lib/site-packages/urllib3/util/ssl_.py +1 -1
  117. py2docfx/venv/venv1/Lib/site-packages/azure/core/_version.py +1 -1
  118. py2docfx/venv/venv1/Lib/site-packages/azure/core/pipeline/_base_async.py +1 -1
  119. py2docfx/venv/venv1/Lib/site-packages/azure/core/pipeline/transport/_aiohttp.py +1 -1
  120. py2docfx/venv/venv1/Lib/site-packages/azure/core/pipeline/transport/_base_async.py +2 -1
  121. py2docfx/venv/venv1/Lib/site-packages/azure/core/pipeline/transport/_requests_asyncio.py +1 -1
  122. py2docfx/venv/venv1/Lib/site-packages/azure/core/rest/_aiohttp.py +2 -2
  123. py2docfx/venv/venv1/Lib/site-packages/azure/core/rest/_requests_asyncio.py +1 -1
  124. py2docfx/venv/venv1/Lib/site-packages/azure/core/tracing/opentelemetry.py +13 -1
  125. py2docfx/venv/venv1/Lib/site-packages/azure/core/utils/_pipeline_transport_rest_shared_async.py +2 -1
  126. py2docfx/venv/venv1/Lib/site-packages/azure/core/utils/_utils.py +1 -1
  127. py2docfx/venv/venv1/Lib/site-packages/azure/identity/_constants.py +1 -0
  128. py2docfx/venv/venv1/Lib/site-packages/azure/identity/_credentials/default.py +23 -2
  129. py2docfx/venv/venv1/Lib/site-packages/azure/identity/_credentials/environment.py +12 -16
  130. py2docfx/venv/venv1/Lib/site-packages/azure/identity/_credentials/service_fabric.py +22 -1
  131. py2docfx/venv/venv1/Lib/site-packages/azure/identity/_credentials/user_password.py +10 -6
  132. py2docfx/venv/venv1/Lib/site-packages/azure/identity/_credentials/vscode.py +13 -4
  133. py2docfx/venv/venv1/Lib/site-packages/azure/identity/_internal/auth_code_redirect_handler.py +3 -5
  134. py2docfx/venv/venv1/Lib/site-packages/azure/identity/_internal/msal_client.py +2 -1
  135. py2docfx/venv/venv1/Lib/site-packages/azure/identity/_persistent_cache.py +3 -2
  136. py2docfx/venv/venv1/Lib/site-packages/azure/identity/_version.py +1 -1
  137. py2docfx/venv/venv1/Lib/site-packages/azure/identity/aio/_credentials/azd_cli.py +1 -1
  138. py2docfx/venv/venv1/Lib/site-packages/azure/identity/aio/_credentials/azure_cli.py +1 -1
  139. py2docfx/venv/venv1/Lib/site-packages/azure/identity/aio/_credentials/azure_powershell.py +1 -1
  140. py2docfx/venv/venv1/Lib/site-packages/azure/identity/aio/_credentials/chained.py +1 -1
  141. py2docfx/venv/venv1/Lib/site-packages/azure/identity/aio/_credentials/default.py +22 -2
  142. py2docfx/venv/venv1/Lib/site-packages/azure/identity/aio/_credentials/environment.py +2 -2
  143. py2docfx/venv/venv1/Lib/site-packages/azure/identity/aio/_credentials/service_fabric.py +17 -1
  144. py2docfx/venv/venv1/Lib/site-packages/azure/identity/aio/_credentials/vscode.py +4 -4
  145. py2docfx/venv/venv1/Lib/site-packages/certifi/__init__.py +1 -1
  146. py2docfx/venv/venv1/Lib/site-packages/certifi/core.py +1 -32
  147. py2docfx/venv/venv1/Lib/site-packages/charset_normalizer/cli/__main__.py +62 -2
  148. py2docfx/venv/venv1/Lib/site-packages/charset_normalizer/constant.py +17 -0
  149. py2docfx/venv/venv1/Lib/site-packages/charset_normalizer/legacy.py +1 -3
  150. py2docfx/venv/venv1/Lib/site-packages/charset_normalizer/md.py +19 -14
  151. py2docfx/venv/venv1/Lib/site-packages/charset_normalizer/utils.py +6 -0
  152. py2docfx/venv/venv1/Lib/site-packages/charset_normalizer/version.py +1 -1
  153. py2docfx/venv/venv1/Lib/site-packages/cryptography/__about__.py +2 -2
  154. py2docfx/venv/venv1/Lib/site-packages/cryptography/__init__.py +2 -2
  155. py2docfx/venv/venv1/Lib/site-packages/cryptography/fernet.py +2 -1
  156. py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/_oid.py +35 -2
  157. py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/backends/openssl/backend.py +33 -10
  158. py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/bindings/_rust/__init__.pyi +14 -5
  159. py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/bindings/_rust/ocsp.pyi +2 -2
  160. py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/bindings/_rust/openssl/__init__.pyi +3 -0
  161. py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/bindings/_rust/openssl/aead.pyi +49 -45
  162. py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/bindings/_rust/openssl/ciphers.pyi +2 -2
  163. py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/bindings/_rust/openssl/ed25519.pyi +2 -1
  164. py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/bindings/_rust/openssl/ed448.pyi +2 -1
  165. py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/bindings/_rust/openssl/hashes.pyi +10 -1
  166. py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/bindings/_rust/openssl/hmac.pyi +3 -2
  167. py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/bindings/_rust/openssl/kdf.pyi +8 -2
  168. py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/bindings/_rust/openssl/keys.pyi +3 -2
  169. py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/bindings/_rust/openssl/poly1305.pyi +6 -4
  170. py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/bindings/_rust/openssl/x25519.pyi +2 -1
  171. py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/bindings/_rust/openssl/x448.pyi +2 -1
  172. py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/bindings/_rust/pkcs12.pyi +9 -3
  173. py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/bindings/_rust/pkcs7.pyi +7 -6
  174. py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/bindings/_rust/test_support.pyi +2 -1
  175. py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/bindings/_rust/x509.pyi +79 -12
  176. py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/bindings/openssl/_conditional.py +9 -1
  177. py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/bindings/openssl/binding.py +2 -1
  178. py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/decrepit/ciphers/algorithms.py +5 -0
  179. py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/primitives/_cipheralgorithm.py +4 -2
  180. py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/primitives/_serialization.py +1 -2
  181. py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/primitives/asymmetric/dh.py +12 -0
  182. py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/primitives/asymmetric/dsa.py +16 -3
  183. py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/primitives/asymmetric/ec.py +47 -3
  184. py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/primitives/asymmetric/ed25519.py +16 -3
  185. py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/primitives/asymmetric/ed448.py +16 -3
  186. py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/primitives/asymmetric/rsa.py +14 -0
  187. py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/primitives/asymmetric/x25519.py +14 -1
  188. py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/primitives/asymmetric/x448.py +14 -1
  189. py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/primitives/ciphers/algorithms.py +6 -6
  190. py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/primitives/ciphers/base.py +5 -4
  191. py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/primitives/ciphers/modes.py +18 -18
  192. py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/primitives/hashes.py +5 -1
  193. py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/primitives/kdf/concatkdf.py +5 -4
  194. py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/primitives/kdf/hkdf.py +4 -4
  195. py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/primitives/kdf/kbkdf.py +7 -4
  196. py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/primitives/kdf/pbkdf2.py +1 -1
  197. py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/primitives/kdf/x963kdf.py +1 -1
  198. py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/primitives/padding.py +7 -121
  199. py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/primitives/serialization/__init__.py +2 -0
  200. py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/primitives/serialization/pkcs12.py +21 -1
  201. py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/primitives/serialization/pkcs7.py +48 -6
  202. py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/primitives/serialization/ssh.py +68 -18
  203. py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/primitives/twofactor/hotp.py +3 -2
  204. py2docfx/venv/venv1/Lib/site-packages/cryptography/hazmat/primitives/twofactor/totp.py +2 -1
  205. py2docfx/venv/venv1/Lib/site-packages/cryptography/utils.py +15 -3
  206. py2docfx/venv/venv1/Lib/site-packages/cryptography/x509/__init__.py +3 -0
  207. py2docfx/venv/venv1/Lib/site-packages/cryptography/x509/base.py +39 -6
  208. py2docfx/venv/venv1/Lib/site-packages/cryptography/x509/extensions.py +100 -49
  209. py2docfx/venv/venv1/Lib/site-packages/cryptography/x509/name.py +27 -15
  210. py2docfx/venv/venv1/Lib/site-packages/cryptography/x509/ocsp.py +60 -25
  211. py2docfx/venv/venv1/Lib/site-packages/cryptography/x509/oid.py +2 -0
  212. py2docfx/venv/venv1/Lib/site-packages/cryptography/x509/verification.py +6 -0
  213. py2docfx/venv/venv1/Lib/site-packages/google/api_core/bidi.py +17 -4
  214. py2docfx/venv/venv1/Lib/site-packages/google/api_core/client_info.py +6 -0
  215. py2docfx/venv/venv1/Lib/site-packages/google/api_core/gapic_v1/client_info.py +1 -0
  216. py2docfx/venv/venv1/Lib/site-packages/google/api_core/retry/retry_base.py +13 -4
  217. py2docfx/venv/venv1/Lib/site-packages/google/api_core/retry/retry_streaming.py +7 -6
  218. py2docfx/venv/venv1/Lib/site-packages/google/api_core/retry/retry_streaming_async.py +8 -5
  219. py2docfx/venv/venv1/Lib/site-packages/google/api_core/retry/retry_unary.py +7 -6
  220. py2docfx/venv/venv1/Lib/site-packages/google/api_core/retry/retry_unary_async.py +7 -6
  221. py2docfx/venv/venv1/Lib/site-packages/google/api_core/version.py +1 -1
  222. py2docfx/venv/venv1/Lib/site-packages/google/auth/_default.py +2 -36
  223. py2docfx/venv/venv1/Lib/site-packages/google/auth/_helpers.py +240 -0
  224. py2docfx/venv/venv1/Lib/site-packages/google/auth/aio/_helpers.py +62 -0
  225. py2docfx/venv/venv1/Lib/site-packages/google/auth/aio/transport/aiohttp.py +6 -0
  226. py2docfx/venv/venv1/Lib/site-packages/google/auth/compute_engine/_metadata.py +5 -1
  227. py2docfx/venv/venv1/Lib/site-packages/google/auth/compute_engine/credentials.py +2 -1
  228. py2docfx/venv/venv1/Lib/site-packages/google/auth/identity_pool.py +91 -2
  229. py2docfx/venv/venv1/Lib/site-packages/google/auth/impersonated_credentials.py +75 -0
  230. py2docfx/venv/venv1/Lib/site-packages/google/auth/transport/__init__.py +1 -0
  231. py2docfx/venv/venv1/Lib/site-packages/google/auth/transport/_aiohttp_requests.py +8 -1
  232. py2docfx/venv/venv1/Lib/site-packages/google/auth/transport/_http_client.py +3 -1
  233. py2docfx/venv/venv1/Lib/site-packages/google/auth/transport/requests.py +4 -1
  234. py2docfx/venv/venv1/Lib/site-packages/google/auth/transport/urllib3.py +15 -5
  235. py2docfx/venv/venv1/Lib/site-packages/google/auth/version.py +1 -1
  236. py2docfx/venv/venv1/Lib/site-packages/google/oauth2/id_token.py +12 -0
  237. py2docfx/venv/venv1/Lib/site-packages/google/oauth2/webauthn_types.py +1 -1
  238. py2docfx/venv/venv1/Lib/site-packages/google/protobuf/__init__.py +1 -1
  239. py2docfx/venv/venv1/Lib/site-packages/google/protobuf/any.py +15 -1
  240. py2docfx/venv/venv1/Lib/site-packages/google/protobuf/any_pb2.py +3 -3
  241. py2docfx/venv/venv1/Lib/site-packages/google/protobuf/api_pb2.py +3 -3
  242. py2docfx/venv/venv1/Lib/site-packages/google/protobuf/compiler/plugin_pb2.py +3 -3
  243. py2docfx/venv/venv1/Lib/site-packages/google/protobuf/descriptor.py +15 -2
  244. py2docfx/venv/venv1/Lib/site-packages/google/protobuf/descriptor_pb2.py +258 -113
  245. py2docfx/venv/venv1/Lib/site-packages/google/protobuf/descriptor_pool.py +22 -8
  246. py2docfx/venv/venv1/Lib/site-packages/google/protobuf/duration_pb2.py +3 -3
  247. py2docfx/venv/venv1/Lib/site-packages/google/protobuf/empty_pb2.py +3 -3
  248. py2docfx/venv/venv1/Lib/site-packages/google/protobuf/field_mask_pb2.py +3 -3
  249. py2docfx/venv/venv1/Lib/site-packages/google/protobuf/internal/decoder.py +106 -23
  250. py2docfx/venv/venv1/Lib/site-packages/google/protobuf/internal/field_mask.py +3 -1
  251. py2docfx/venv/venv1/Lib/site-packages/google/protobuf/internal/python_edition_defaults.py +1 -1
  252. py2docfx/venv/venv1/Lib/site-packages/google/protobuf/internal/python_message.py +21 -18
  253. py2docfx/venv/venv1/Lib/site-packages/google/protobuf/internal/testing_refleaks.py +8 -2
  254. py2docfx/venv/venv1/Lib/site-packages/google/protobuf/internal/well_known_types.py +60 -43
  255. py2docfx/venv/venv1/Lib/site-packages/google/protobuf/json_format.py +4 -5
  256. py2docfx/venv/venv1/Lib/site-packages/google/protobuf/message_factory.py +16 -0
  257. py2docfx/venv/venv1/Lib/site-packages/google/protobuf/runtime_version.py +2 -2
  258. py2docfx/venv/venv1/Lib/site-packages/google/protobuf/source_context_pb2.py +3 -3
  259. py2docfx/venv/venv1/Lib/site-packages/google/protobuf/struct_pb2.py +3 -3
  260. py2docfx/venv/venv1/Lib/site-packages/google/protobuf/text_format.py +11 -7
  261. py2docfx/venv/venv1/Lib/site-packages/google/protobuf/timestamp_pb2.py +3 -3
  262. py2docfx/venv/venv1/Lib/site-packages/google/protobuf/type_pb2.py +3 -3
  263. py2docfx/venv/venv1/Lib/site-packages/google/protobuf/wrappers_pb2.py +3 -3
  264. py2docfx/venv/venv1/Lib/site-packages/google/rpc/error_details_pb2.py +29 -23
  265. py2docfx/venv/venv1/Lib/site-packages/google/rpc/error_details_pb2.pyi +41 -2
  266. py2docfx/venv/venv1/Lib/site-packages/msal/application.py +1 -0
  267. py2docfx/venv/venv1/Lib/site-packages/msal/individual_cache.py +9 -5
  268. py2docfx/venv/venv1/Lib/site-packages/msal/managed_identity.py +4 -5
  269. py2docfx/venv/venv1/Lib/site-packages/msal/sku.py +1 -1
  270. py2docfx/venv/venv1/Lib/site-packages/msal/throttled_http_client.py +58 -30
  271. py2docfx/venv/venv1/Lib/site-packages/opencensus/__init__.py +1 -1
  272. py2docfx/venv/venv1/Lib/site-packages/opencensus/ext/__init__.py +1 -1
  273. py2docfx/venv/venv1/Lib/site-packages/opencensus/ext/azure/__init__.py +1 -1
  274. py2docfx/venv/venv1/Lib/site-packages/opencensus/ext/azure/common/__init__.py +138 -138
  275. py2docfx/venv/venv1/Lib/site-packages/opencensus/ext/azure/common/exporter.py +93 -93
  276. py2docfx/venv/venv1/Lib/site-packages/opencensus/ext/azure/common/processor.py +63 -63
  277. py2docfx/venv/venv1/Lib/site-packages/opencensus/ext/azure/common/protocol.py +206 -206
  278. py2docfx/venv/venv1/Lib/site-packages/opencensus/ext/azure/common/storage.py +205 -205
  279. py2docfx/venv/venv1/Lib/site-packages/opencensus/ext/azure/common/transport.py +355 -355
  280. py2docfx/venv/venv1/Lib/site-packages/opencensus/ext/azure/common/utils.py +79 -79
  281. py2docfx/venv/venv1/Lib/site-packages/opencensus/ext/azure/common/version.py +15 -15
  282. py2docfx/venv/venv1/Lib/site-packages/opencensus/ext/azure/log_exporter/__init__.py +314 -314
  283. py2docfx/venv/venv1/Lib/site-packages/opencensus/ext/azure/metrics_exporter/__init__.py +190 -190
  284. py2docfx/venv/venv1/Lib/site-packages/opencensus/ext/azure/metrics_exporter/standard_metrics/__init__.py +62 -62
  285. py2docfx/venv/venv1/Lib/site-packages/opencensus/ext/azure/metrics_exporter/standard_metrics/cpu.py +50 -50
  286. py2docfx/venv/venv1/Lib/site-packages/opencensus/ext/azure/metrics_exporter/standard_metrics/http_requests.py +176 -176
  287. py2docfx/venv/venv1/Lib/site-packages/opencensus/ext/azure/metrics_exporter/standard_metrics/memory.py +42 -42
  288. py2docfx/venv/venv1/Lib/site-packages/opencensus/ext/azure/metrics_exporter/standard_metrics/process.py +87 -87
  289. py2docfx/venv/venv1/Lib/site-packages/opencensus/ext/azure/statsbeat/__init__.py +1 -1
  290. py2docfx/venv/venv1/Lib/site-packages/opencensus/ext/azure/statsbeat/state.py +50 -50
  291. py2docfx/venv/venv1/Lib/site-packages/opencensus/ext/azure/statsbeat/statsbeat.py +100 -100
  292. py2docfx/venv/venv1/Lib/site-packages/opencensus/ext/azure/statsbeat/statsbeat_metrics.py +480 -480
  293. py2docfx/venv/venv1/Lib/site-packages/opencensus/ext/azure/trace_exporter/__init__.py +236 -236
  294. py2docfx/venv/venv1/Lib/site-packages/packaging/__init__.py +1 -1
  295. py2docfx/venv/venv1/Lib/site-packages/packaging/_elffile.py +1 -2
  296. py2docfx/venv/venv1/Lib/site-packages/packaging/_manylinux.py +1 -2
  297. py2docfx/venv/venv1/Lib/site-packages/packaging/_parser.py +1 -2
  298. py2docfx/venv/venv1/Lib/site-packages/packaging/_tokenizer.py +5 -4
  299. py2docfx/venv/venv1/Lib/site-packages/packaging/licenses/__init__.py +1 -1
  300. py2docfx/venv/venv1/Lib/site-packages/packaging/markers.py +53 -22
  301. py2docfx/venv/venv1/Lib/site-packages/packaging/metadata.py +1 -2
  302. py2docfx/venv/venv1/Lib/site-packages/packaging/specifiers.py +1 -2
  303. py2docfx/venv/venv1/Lib/site-packages/packaging/tags.py +39 -0
  304. py2docfx/venv/venv1/Lib/site-packages/pkg_resources/__init__.py +6 -7
  305. py2docfx/venv/venv1/Lib/site-packages/requests/__version__.py +2 -2
  306. py2docfx/venv/venv1/Lib/site-packages/requests/compat.py +12 -0
  307. py2docfx/venv/venv1/Lib/site-packages/requests/models.py +3 -1
  308. py2docfx/venv/venv1/Lib/site-packages/requests/utils.py +6 -16
  309. py2docfx/venv/venv1/Lib/site-packages/rsa/__init__.py +2 -2
  310. py2docfx/venv/venv1/Lib/site-packages/rsa/asn1.py +52 -52
  311. py2docfx/venv/venv1/Lib/site-packages/rsa/cli.py +321 -321
  312. py2docfx/venv/venv1/Lib/site-packages/rsa/common.py +184 -184
  313. py2docfx/venv/venv1/Lib/site-packages/rsa/core.py +53 -53
  314. py2docfx/venv/venv1/Lib/site-packages/rsa/key.py +858 -858
  315. py2docfx/venv/venv1/Lib/site-packages/rsa/parallel.py +96 -96
  316. py2docfx/venv/venv1/Lib/site-packages/rsa/pem.py +134 -134
  317. py2docfx/venv/venv1/Lib/site-packages/rsa/pkcs1.py +485 -485
  318. py2docfx/venv/venv1/Lib/site-packages/rsa/pkcs1_v2.py +100 -100
  319. py2docfx/venv/venv1/Lib/site-packages/rsa/prime.py +198 -198
  320. py2docfx/venv/venv1/Lib/site-packages/rsa/py.typed +1 -1
  321. py2docfx/venv/venv1/Lib/site-packages/rsa/randnum.py +95 -95
  322. py2docfx/venv/venv1/Lib/site-packages/rsa/transform.py +72 -72
  323. py2docfx/venv/venv1/Lib/site-packages/rsa/util.py +97 -97
  324. py2docfx/venv/venv1/Lib/site-packages/setuptools/__init__.py +0 -38
  325. py2docfx/venv/venv1/Lib/site-packages/setuptools/_discovery.py +33 -0
  326. py2docfx/venv/venv1/Lib/site-packages/setuptools/_distutils/command/build_scripts.py +1 -1
  327. py2docfx/venv/venv1/Lib/site-packages/setuptools/_distutils/command/config.py +0 -2
  328. py2docfx/venv/venv1/Lib/site-packages/setuptools/_distutils/compilers/C/tests/test_unix.py +63 -0
  329. py2docfx/venv/venv1/Lib/site-packages/setuptools/_distutils/compilers/C/unix.py +5 -6
  330. py2docfx/venv/venv1/Lib/site-packages/setuptools/_entry_points.py +4 -0
  331. py2docfx/venv/venv1/Lib/site-packages/setuptools/_normalization.py +0 -2
  332. py2docfx/venv/venv1/Lib/site-packages/setuptools/_path.py +12 -3
  333. py2docfx/venv/venv1/Lib/site-packages/setuptools/_reqs.py +1 -1
  334. py2docfx/venv/venv1/Lib/site-packages/setuptools/_scripts.py +361 -0
  335. py2docfx/venv/venv1/Lib/site-packages/setuptools/_shutil.py +6 -0
  336. py2docfx/venv/venv1/Lib/site-packages/setuptools/build_meta.py +25 -37
  337. py2docfx/venv/venv1/Lib/site-packages/setuptools/command/bdist_egg.py +9 -11
  338. py2docfx/venv/venv1/Lib/site-packages/setuptools/command/bdist_wheel.py +1 -1
  339. py2docfx/venv/venv1/Lib/site-packages/setuptools/command/build_ext.py +29 -28
  340. py2docfx/venv/venv1/Lib/site-packages/setuptools/command/develop.py +39 -179
  341. py2docfx/venv/venv1/Lib/site-packages/setuptools/command/easy_install.py +17 -2352
  342. py2docfx/venv/venv1/Lib/site-packages/setuptools/command/editable_wheel.py +14 -31
  343. py2docfx/venv/venv1/Lib/site-packages/setuptools/command/egg_info.py +0 -2
  344. py2docfx/venv/venv1/Lib/site-packages/setuptools/command/install.py +3 -55
  345. py2docfx/venv/venv1/Lib/site-packages/setuptools/command/install_scripts.py +5 -11
  346. py2docfx/venv/venv1/Lib/site-packages/setuptools/command/sdist.py +1 -1
  347. py2docfx/venv/venv1/Lib/site-packages/setuptools/compat/py310.py +11 -0
  348. py2docfx/venv/venv1/Lib/site-packages/setuptools/dist.py +10 -12
  349. py2docfx/venv/venv1/Lib/site-packages/setuptools/installer.py +34 -29
  350. py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/contexts.py +0 -14
  351. py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/fixtures.py +235 -0
  352. py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/integration/test_pbr.py +20 -0
  353. py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/test_build_meta.py +0 -24
  354. py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/test_develop.py +1 -64
  355. py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/test_dist.py +2 -2
  356. py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/test_dist_info.py +0 -63
  357. py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/test_editable_install.py +15 -41
  358. py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/test_egg_info.py +3 -2
  359. py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/test_scripts.py +12 -0
  360. py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/test_wheel.py +12 -36
  361. py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/test_windows_wrappers.py +3 -4
  362. py2docfx/venv/venv1/Lib/site-packages/setuptools/wheel.py +49 -24
  363. py2docfx/venv/venv1/Lib/site-packages/typing_extensions.py +357 -703
  364. py2docfx/venv/venv1/Lib/site-packages/urllib3/_version.py +2 -2
  365. py2docfx/venv/venv1/Lib/site-packages/urllib3/connection.py +87 -38
  366. py2docfx/venv/venv1/Lib/site-packages/urllib3/contrib/emscripten/fetch.py +20 -0
  367. py2docfx/venv/venv1/Lib/site-packages/urllib3/poolmanager.py +17 -1
  368. py2docfx/venv/venv1/Lib/site-packages/urllib3/response.py +53 -24
  369. py2docfx/venv/venv1/Lib/site-packages/urllib3/util/request.py +12 -4
  370. py2docfx/venv/venv1/Lib/site-packages/urllib3/util/ssl_.py +1 -1
  371. {py2docfx-0.1.16.dev2064350.dist-info → py2docfx-0.1.17.dist-info}/METADATA +1 -1
  372. {py2docfx-0.1.16.dev2064350.dist-info → py2docfx-0.1.17.dist-info}/RECORD +374 -372
  373. {py2docfx-0.1.16.dev2064350.dist-info → py2docfx-0.1.17.dist-info}/WHEEL +1 -1
  374. py2docfx/venv/basevenv/Lib/site-packages/setuptools/package_index.py +0 -1137
  375. py2docfx/venv/basevenv/Lib/site-packages/setuptools/sandbox.py +0 -536
  376. py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/server.py +0 -86
  377. py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/test_easy_install.py +0 -1476
  378. py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/test_packageindex.py +0 -267
  379. py2docfx/venv/basevenv/Lib/site-packages/setuptools/tests/test_sandbox.py +0 -134
  380. py2docfx/venv/venv1/Lib/site-packages/azure/identity/_credentials/application.py +0 -119
  381. py2docfx/venv/venv1/Lib/site-packages/azure/identity/aio/_credentials/application.py +0 -121
  382. py2docfx/venv/venv1/Lib/site-packages/setuptools/package_index.py +0 -1137
  383. py2docfx/venv/venv1/Lib/site-packages/setuptools/sandbox.py +0 -536
  384. py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/server.py +0 -86
  385. py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/test_easy_install.py +0 -1476
  386. py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/test_packageindex.py +0 -267
  387. py2docfx/venv/venv1/Lib/site-packages/setuptools/tests/test_sandbox.py +0 -134
  388. {py2docfx-0.1.16.dev2064350.dist-info → py2docfx-0.1.17.dist-info}/top_level.txt +0 -0
@@ -1,355 +1,355 @@
1
- # Copyright 2019, OpenCensus Authors
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License");
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # http://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
-
15
- import json
16
- import logging
17
- import threading
18
- import time
19
-
20
- import requests
21
- from azure.core.exceptions import ClientAuthenticationError
22
- from azure.identity._exceptions import CredentialUnavailableError
23
-
24
- from opencensus.ext.azure.statsbeat import state
25
-
26
- try:
27
- from urllib.parse import urlparse
28
- except ImportError:
29
- from urlparse import urlparse
30
-
31
-
32
- logger = logging.getLogger(__name__)
33
-
34
-
35
- _MAX_CONSECUTIVE_REDIRECTS = 10
36
- _MONITOR_OAUTH_SCOPE = "https://monitor.azure.com//.default"
37
- _requests_lock = threading.Lock()
38
- _requests_map = {}
39
- _REACHED_INGESTION_STATUS_CODES = (200, 206, 402, 408, 429, 439, 500)
40
- REDIRECT_STATUS_CODES = (307, 308)
41
- RETRYABLE_STATUS_CODES = (
42
- 401, # Unauthorized
43
- 403, # Forbidden
44
- 408, # Request Timeout
45
- 429, # Too Many Requests - retry after
46
- 500, # Internal server error
47
- 502, # Bad Gateway
48
- 503, # Service unavailable
49
- 504, # Gateway timeout
50
- )
51
- THROTTLE_STATUS_CODES = (
52
- 402, # Quota, too Many Requests over extended time
53
- 439, # Quota, too Many Requests over extended time (legacy)
54
- )
55
-
56
-
57
- class TransportStatusCode:
58
- SUCCESS = 0
59
- RETRY = 1
60
- DROP = 2
61
- STATSBEAT_SHUTDOWN = 3
62
-
63
-
64
- class TransportMixin(object):
65
-
66
- # check to see whether its the case of stats collection
67
- def _check_stats_collection(self):
68
- return state.is_statsbeat_enabled() and \
69
- not state.get_statsbeat_shutdown() and \
70
- not self._is_stats_exporter()
71
-
72
- # check if the current exporter is a statsbeat metric exporter
73
- # only applies to metrics exporter
74
- def _is_stats_exporter(self):
75
- return hasattr(self, '_is_stats') and self._is_stats
76
-
77
- def _transmit_from_storage(self):
78
- if self.storage:
79
- for blob in self.storage.gets():
80
- # give a few more seconds for blob lease operation
81
- # to reduce the chance of race (for perf consideration)
82
- if blob.lease(self.options.timeout + 5):
83
- envelopes = blob.get()
84
- result = self._transmit(envelopes)
85
- if result is TransportStatusCode.RETRY:
86
- blob.lease(result)
87
- else:
88
- blob.delete()
89
-
90
- def _transmit(self, envelopes):
91
- """
92
- Transmit the data envelopes to the ingestion service.
93
- Return a negative value for partial success or non-retryable failure.
94
- Return 0 if all envelopes have been successfully ingested.
95
- Return the next retry time in seconds for retryable failure.
96
- This function should never throw exception.
97
- """
98
- if not envelopes:
99
- return 0
100
- status = None
101
- exception = None
102
- try:
103
- start_time = time.time()
104
- headers = {
105
- 'Accept': 'application/json',
106
- 'Content-Type': 'application/json; charset=utf-8',
107
- }
108
- endpoint = self.options.endpoint
109
- if self.options.credential:
110
- token = self.options.credential.get_token(_MONITOR_OAUTH_SCOPE)
111
- headers["Authorization"] = "Bearer {}".format(token.token)
112
- endpoint += '/v2.1/track'
113
- proxies = json.loads(self.options.proxies)
114
- allow_redirects = len(proxies) != 0
115
-
116
- response = requests.post(
117
- url=endpoint,
118
- data=json.dumps(envelopes, default=str),
119
- headers=headers,
120
- timeout=self.options.timeout,
121
- proxies=proxies,
122
- allow_redirects=allow_redirects,
123
- )
124
- except requests.Timeout as ex:
125
- if not self._is_stats_exporter():
126
- logger.warning(
127
- 'Request time out. Ingestion may be backed up. Retrying.')
128
- status = TransportStatusCode.RETRY
129
- exception = ex
130
- except requests.RequestException as ex:
131
- if not self._is_stats_exporter():
132
- logger.warning(
133
- 'Retrying due to transient client side error %s.', ex)
134
- status = TransportStatusCode.RETRY
135
- exception = ex
136
- except CredentialUnavailableError as ex:
137
- if not self._is_stats_exporter():
138
- logger.warning('Credential error. %s. Dropping telemetry.', ex)
139
- status = TransportStatusCode.DROP
140
- exception = ex
141
- except ClientAuthenticationError as ex:
142
- if not self._is_stats_exporter():
143
- logger.warning('Authentication error %s', ex)
144
- status = TransportStatusCode.RETRY
145
- exception = ex
146
- except Exception as ex:
147
- if not self._is_stats_exporter():
148
- logger.warning(
149
- 'Error when sending request %s. Dropping telemetry.', ex)
150
- status = TransportStatusCode.DROP
151
- exception = ex
152
- finally:
153
- if self._check_stats_collection():
154
- _update_requests_map('count')
155
- end_time = time.time()
156
- if self._check_stats_collection():
157
- _update_requests_map('duration', value=end_time-start_time)
158
-
159
- if status is not None and exception is not None:
160
- if self._check_stats_collection():
161
- _update_requests_map('exception', value=exception.__class__.__name__) # noqa: E501
162
- return status
163
- if self._is_stats_exporter() and \
164
- not state.get_statsbeat_shutdown() and \
165
- not state.get_statsbeat_initial_success():
166
- # If ingestion threshold during statsbeat initialization is
167
- # reached, return back code to shut it down
168
- if _statsbeat_failure_reached_threshold():
169
- return TransportStatusCode.STATSBEAT_SHUTDOWN
170
-
171
- text = 'N/A'
172
- status_code = 0
173
- try:
174
- text = response.text
175
- status_code = response.status_code
176
- except Exception as ex:
177
- if not self._is_stats_exporter():
178
- logger.warning('Error while reading response body %s.', ex)
179
- if self._check_stats_collection():
180
- _update_requests_map('exception', value=ex.__class__.__name__)
181
- return TransportStatusCode.DROP
182
-
183
- if self._is_stats_exporter() and \
184
- not state.get_statsbeat_shutdown() and \
185
- not state.get_statsbeat_initial_success():
186
- # If statsbeat exporter, record initialization as success if
187
- # appropriate status code is returned
188
- if _reached_ingestion_status_code(status_code):
189
- state.set_statsbeat_initial_success(True)
190
- elif _statsbeat_failure_reached_threshold():
191
- # If ingestion threshold during statsbeat initialization is
192
- # reached, return back code to shut it down
193
- return TransportStatusCode.STATSBEAT_SHUTDOWN
194
-
195
- if status_code == 200: # Success
196
- self._consecutive_redirects = 0
197
- if self._check_stats_collection():
198
- _update_requests_map('success')
199
- return TransportStatusCode.SUCCESS
200
- elif status_code == 206: # Partial Content
201
- data = None
202
- try:
203
- data = json.loads(text)
204
- except Exception as ex:
205
- if not self._is_stats_exporter():
206
- logger.warning('Error while reading response body %s for partial content.', ex) # noqa: E501
207
- if self._check_stats_collection():
208
- _update_requests_map('exception', value=ex.__class__.__name__) # noqa: E501
209
- return TransportStatusCode.DROP
210
- if data:
211
- try:
212
- resend_envelopes = []
213
- for error in data['errors']:
214
- if _status_code_is_retryable(error['statusCode']):
215
- resend_envelopes.append(envelopes[error['index']])
216
- else:
217
- if not self._is_stats_exporter():
218
- logger.error(
219
- 'Data drop %s: %s %s.',
220
- error['statusCode'],
221
- error['message'],
222
- envelopes[error['index']],
223
- )
224
- if self.storage and resend_envelopes:
225
- self.storage.put(resend_envelopes)
226
- except Exception as ex:
227
- if not self._is_stats_exporter():
228
- logger.error(
229
- 'Error while processing %s: %s %s.',
230
- status_code,
231
- text,
232
- ex,
233
- )
234
- if self._check_stats_collection():
235
- _update_requests_map('exception', value=ex.__class__.__name__) # noqa: E501
236
- return TransportStatusCode.DROP
237
- # cannot parse response body, fallback to retry
238
- elif _status_code_is_redirect(status_code): # Redirect
239
- # for statsbeat, these are not tracked as success nor failures
240
- self._consecutive_redirects += 1
241
- if self._consecutive_redirects < _MAX_CONSECUTIVE_REDIRECTS:
242
- if response.headers:
243
- location = response.headers.get("location")
244
- if location:
245
- url = urlparse(location)
246
- if url.scheme and url.netloc:
247
- # Change the host to the new redirected host
248
- self.options.endpoint = "{}://{}".format(url.scheme, url.netloc) # noqa: E501
249
- # Attempt to export again
250
- return self._transmit(envelopes)
251
- if not self._is_stats_exporter():
252
- logger.error(
253
- "Error parsing redirect information."
254
- )
255
- else:
256
- if not self._is_stats_exporter():
257
- logger.error(
258
- "Error sending telemetry because of circular redirects." # noqa: E501
259
- " Please check the integrity of your connection string." # noqa: E501
260
- )
261
- # If redirect but did not return, exception occured
262
- if self._check_stats_collection():
263
- _update_requests_map('exception', value="Circular Redirect")
264
- return TransportStatusCode.DROP
265
- elif _status_code_is_throttle(status_code): # Throttle
266
- if self._check_stats_collection():
267
- # 402: Monthly Quota Exceeded (new SDK)
268
- # 439: Monthly Quota Exceeded (old SDK) <- Currently OC SDK
269
- _update_requests_map('throttle', value=status_code)
270
- if not self._is_stats_exporter():
271
- logger.warning(
272
- 'Telemetry was throttled %s: %s.',
273
- status_code,
274
- text,
275
- )
276
- return TransportStatusCode.DROP
277
- elif _status_code_is_retryable(status_code): # Retry
278
- if not self._is_stats_exporter():
279
- if status_code == 401: # Authentication error
280
- logger.warning(
281
- 'Authentication error %s: %s. Retrying.',
282
- status_code,
283
- text,
284
- )
285
- elif status_code == 403:
286
- # Forbidden error
287
- # Can occur when v2 endpoint is used while AI resource is configured # noqa: E501
288
- # with disableLocalAuth
289
- logger.warning(
290
- 'Forbidden error %s: %s. Retrying.',
291
- status_code,
292
- text,
293
- )
294
- else:
295
- logger.warning(
296
- 'Transient server side error %s: %s. Retrying.',
297
- status_code,
298
- text,
299
- )
300
- if self._check_stats_collection():
301
- _update_requests_map('retry', value=status_code)
302
- return TransportStatusCode.RETRY
303
- else:
304
- # 400 and 404 will be tracked as failure count
305
- # 400 - Invalid - The server cannot or will not process the request due to the invalid telemetry (invalid data, iKey) # noqa: E501
306
- # 404 - Ingestion is allowed only from stamp specific endpoint - must update connection string # noqa: E501
307
- if self._check_stats_collection():
308
- _update_requests_map('failure', value=status_code)
309
- # Other, server side error (non-retryable)
310
- if not self._is_stats_exporter():
311
- logger.error(
312
- 'Non-retryable server side error %s: %s.',
313
- status_code,
314
- text,
315
- )
316
- return TransportStatusCode.DROP
317
-
318
-
319
- def _status_code_is_redirect(status_code):
320
- return status_code in REDIRECT_STATUS_CODES
321
-
322
-
323
- def _status_code_is_throttle(status_code):
324
- return status_code in THROTTLE_STATUS_CODES
325
-
326
-
327
- def _status_code_is_retryable(status_code):
328
- return status_code in RETRYABLE_STATUS_CODES
329
-
330
-
331
- def _reached_ingestion_status_code(status_code):
332
- return status_code in _REACHED_INGESTION_STATUS_CODES
333
-
334
-
335
- def _statsbeat_failure_reached_threshold():
336
- # increment failure counter for sending statsbeat if in initialization
337
- state.increment_statsbeat_initial_failure_count()
338
- return state.get_statsbeat_initial_failure_count() >= 3
339
-
340
-
341
- def _update_requests_map(type_name, value=None):
342
- # value is either None, duration, status_code or exc_name
343
- with _requests_lock:
344
- if type_name == "success" or type_name == "count": # success, count
345
- _requests_map[type_name] = _requests_map.get(type_name, 0) + 1
346
- elif type_name == "duration": # value will be duration
347
- _requests_map[type_name] = _requests_map.get(type_name, 0) + value # noqa: E501
348
- else: # exception, failure, retry, throttle
349
- # value will be a key (status_code/exc_name)
350
- prev = 0
351
- if _requests_map.get(type_name):
352
- prev = _requests_map.get(type_name).get(value, 0)
353
- else:
354
- _requests_map[type_name] = {}
355
- _requests_map[type_name][value] = prev + 1
1
+ # Copyright 2019, OpenCensus Authors
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ import json
16
+ import logging
17
+ import threading
18
+ import time
19
+
20
+ import requests
21
+ from azure.core.exceptions import ClientAuthenticationError
22
+ from azure.identity._exceptions import CredentialUnavailableError
23
+
24
+ from opencensus.ext.azure.statsbeat import state
25
+
26
+ try:
27
+ from urllib.parse import urlparse
28
+ except ImportError:
29
+ from urlparse import urlparse
30
+
31
+
32
+ logger = logging.getLogger(__name__)
33
+
34
+
35
+ _MAX_CONSECUTIVE_REDIRECTS = 10
36
+ _MONITOR_OAUTH_SCOPE = "https://monitor.azure.com//.default"
37
+ _requests_lock = threading.Lock()
38
+ _requests_map = {}
39
+ _REACHED_INGESTION_STATUS_CODES = (200, 206, 402, 408, 429, 439, 500)
40
+ REDIRECT_STATUS_CODES = (307, 308)
41
+ RETRYABLE_STATUS_CODES = (
42
+ 401, # Unauthorized
43
+ 403, # Forbidden
44
+ 408, # Request Timeout
45
+ 429, # Too Many Requests - retry after
46
+ 500, # Internal server error
47
+ 502, # Bad Gateway
48
+ 503, # Service unavailable
49
+ 504, # Gateway timeout
50
+ )
51
+ THROTTLE_STATUS_CODES = (
52
+ 402, # Quota, too Many Requests over extended time
53
+ 439, # Quota, too Many Requests over extended time (legacy)
54
+ )
55
+
56
+
57
+ class TransportStatusCode:
58
+ SUCCESS = 0
59
+ RETRY = 1
60
+ DROP = 2
61
+ STATSBEAT_SHUTDOWN = 3
62
+
63
+
64
+ class TransportMixin(object):
65
+
66
+ # check to see whether its the case of stats collection
67
+ def _check_stats_collection(self):
68
+ return state.is_statsbeat_enabled() and \
69
+ not state.get_statsbeat_shutdown() and \
70
+ not self._is_stats_exporter()
71
+
72
+ # check if the current exporter is a statsbeat metric exporter
73
+ # only applies to metrics exporter
74
+ def _is_stats_exporter(self):
75
+ return hasattr(self, '_is_stats') and self._is_stats
76
+
77
+ def _transmit_from_storage(self):
78
+ if self.storage:
79
+ for blob in self.storage.gets():
80
+ # give a few more seconds for blob lease operation
81
+ # to reduce the chance of race (for perf consideration)
82
+ if blob.lease(self.options.timeout + 5):
83
+ envelopes = blob.get()
84
+ result = self._transmit(envelopes)
85
+ if result is TransportStatusCode.RETRY:
86
+ blob.lease(result)
87
+ else:
88
+ blob.delete()
89
+
90
+ def _transmit(self, envelopes):
91
+ """
92
+ Transmit the data envelopes to the ingestion service.
93
+ Return a negative value for partial success or non-retryable failure.
94
+ Return 0 if all envelopes have been successfully ingested.
95
+ Return the next retry time in seconds for retryable failure.
96
+ This function should never throw exception.
97
+ """
98
+ if not envelopes:
99
+ return 0
100
+ status = None
101
+ exception = None
102
+ try:
103
+ start_time = time.time()
104
+ headers = {
105
+ 'Accept': 'application/json',
106
+ 'Content-Type': 'application/json; charset=utf-8',
107
+ }
108
+ endpoint = self.options.endpoint
109
+ if self.options.credential:
110
+ token = self.options.credential.get_token(_MONITOR_OAUTH_SCOPE)
111
+ headers["Authorization"] = "Bearer {}".format(token.token)
112
+ endpoint += '/v2.1/track'
113
+ proxies = json.loads(self.options.proxies)
114
+ allow_redirects = len(proxies) != 0
115
+
116
+ response = requests.post(
117
+ url=endpoint,
118
+ data=json.dumps(envelopes, default=str),
119
+ headers=headers,
120
+ timeout=self.options.timeout,
121
+ proxies=proxies,
122
+ allow_redirects=allow_redirects,
123
+ )
124
+ except requests.Timeout as ex:
125
+ if not self._is_stats_exporter():
126
+ logger.warning(
127
+ 'Request time out. Ingestion may be backed up. Retrying.')
128
+ status = TransportStatusCode.RETRY
129
+ exception = ex
130
+ except requests.RequestException as ex:
131
+ if not self._is_stats_exporter():
132
+ logger.warning(
133
+ 'Retrying due to transient client side error %s.', ex)
134
+ status = TransportStatusCode.RETRY
135
+ exception = ex
136
+ except CredentialUnavailableError as ex:
137
+ if not self._is_stats_exporter():
138
+ logger.warning('Credential error. %s. Dropping telemetry.', ex)
139
+ status = TransportStatusCode.DROP
140
+ exception = ex
141
+ except ClientAuthenticationError as ex:
142
+ if not self._is_stats_exporter():
143
+ logger.warning('Authentication error %s', ex)
144
+ status = TransportStatusCode.RETRY
145
+ exception = ex
146
+ except Exception as ex:
147
+ if not self._is_stats_exporter():
148
+ logger.warning(
149
+ 'Error when sending request %s. Dropping telemetry.', ex)
150
+ status = TransportStatusCode.DROP
151
+ exception = ex
152
+ finally:
153
+ if self._check_stats_collection():
154
+ _update_requests_map('count')
155
+ end_time = time.time()
156
+ if self._check_stats_collection():
157
+ _update_requests_map('duration', value=end_time-start_time)
158
+
159
+ if status is not None and exception is not None:
160
+ if self._check_stats_collection():
161
+ _update_requests_map('exception', value=exception.__class__.__name__) # noqa: E501
162
+ return status
163
+ if self._is_stats_exporter() and \
164
+ not state.get_statsbeat_shutdown() and \
165
+ not state.get_statsbeat_initial_success():
166
+ # If ingestion threshold during statsbeat initialization is
167
+ # reached, return back code to shut it down
168
+ if _statsbeat_failure_reached_threshold():
169
+ return TransportStatusCode.STATSBEAT_SHUTDOWN
170
+
171
+ text = 'N/A'
172
+ status_code = 0
173
+ try:
174
+ text = response.text
175
+ status_code = response.status_code
176
+ except Exception as ex:
177
+ if not self._is_stats_exporter():
178
+ logger.warning('Error while reading response body %s.', ex)
179
+ if self._check_stats_collection():
180
+ _update_requests_map('exception', value=ex.__class__.__name__)
181
+ return TransportStatusCode.DROP
182
+
183
+ if self._is_stats_exporter() and \
184
+ not state.get_statsbeat_shutdown() and \
185
+ not state.get_statsbeat_initial_success():
186
+ # If statsbeat exporter, record initialization as success if
187
+ # appropriate status code is returned
188
+ if _reached_ingestion_status_code(status_code):
189
+ state.set_statsbeat_initial_success(True)
190
+ elif _statsbeat_failure_reached_threshold():
191
+ # If ingestion threshold during statsbeat initialization is
192
+ # reached, return back code to shut it down
193
+ return TransportStatusCode.STATSBEAT_SHUTDOWN
194
+
195
+ if status_code == 200: # Success
196
+ self._consecutive_redirects = 0
197
+ if self._check_stats_collection():
198
+ _update_requests_map('success')
199
+ return TransportStatusCode.SUCCESS
200
+ elif status_code == 206: # Partial Content
201
+ data = None
202
+ try:
203
+ data = json.loads(text)
204
+ except Exception as ex:
205
+ if not self._is_stats_exporter():
206
+ logger.warning('Error while reading response body %s for partial content.', ex) # noqa: E501
207
+ if self._check_stats_collection():
208
+ _update_requests_map('exception', value=ex.__class__.__name__) # noqa: E501
209
+ return TransportStatusCode.DROP
210
+ if data:
211
+ try:
212
+ resend_envelopes = []
213
+ for error in data['errors']:
214
+ if _status_code_is_retryable(error['statusCode']):
215
+ resend_envelopes.append(envelopes[error['index']])
216
+ else:
217
+ if not self._is_stats_exporter():
218
+ logger.error(
219
+ 'Data drop %s: %s %s.',
220
+ error['statusCode'],
221
+ error['message'],
222
+ envelopes[error['index']],
223
+ )
224
+ if self.storage and resend_envelopes:
225
+ self.storage.put(resend_envelopes)
226
+ except Exception as ex:
227
+ if not self._is_stats_exporter():
228
+ logger.error(
229
+ 'Error while processing %s: %s %s.',
230
+ status_code,
231
+ text,
232
+ ex,
233
+ )
234
+ if self._check_stats_collection():
235
+ _update_requests_map('exception', value=ex.__class__.__name__) # noqa: E501
236
+ return TransportStatusCode.DROP
237
+ # cannot parse response body, fallback to retry
238
+ elif _status_code_is_redirect(status_code): # Redirect
239
+ # for statsbeat, these are not tracked as success nor failures
240
+ self._consecutive_redirects += 1
241
+ if self._consecutive_redirects < _MAX_CONSECUTIVE_REDIRECTS:
242
+ if response.headers:
243
+ location = response.headers.get("location")
244
+ if location:
245
+ url = urlparse(location)
246
+ if url.scheme and url.netloc:
247
+ # Change the host to the new redirected host
248
+ self.options.endpoint = "{}://{}".format(url.scheme, url.netloc) # noqa: E501
249
+ # Attempt to export again
250
+ return self._transmit(envelopes)
251
+ if not self._is_stats_exporter():
252
+ logger.error(
253
+ "Error parsing redirect information."
254
+ )
255
+ else:
256
+ if not self._is_stats_exporter():
257
+ logger.error(
258
+ "Error sending telemetry because of circular redirects." # noqa: E501
259
+ " Please check the integrity of your connection string." # noqa: E501
260
+ )
261
+ # If redirect but did not return, exception occured
262
+ if self._check_stats_collection():
263
+ _update_requests_map('exception', value="Circular Redirect")
264
+ return TransportStatusCode.DROP
265
+ elif _status_code_is_throttle(status_code): # Throttle
266
+ if self._check_stats_collection():
267
+ # 402: Monthly Quota Exceeded (new SDK)
268
+ # 439: Monthly Quota Exceeded (old SDK) <- Currently OC SDK
269
+ _update_requests_map('throttle', value=status_code)
270
+ if not self._is_stats_exporter():
271
+ logger.warning(
272
+ 'Telemetry was throttled %s: %s.',
273
+ status_code,
274
+ text,
275
+ )
276
+ return TransportStatusCode.DROP
277
+ elif _status_code_is_retryable(status_code): # Retry
278
+ if not self._is_stats_exporter():
279
+ if status_code == 401: # Authentication error
280
+ logger.warning(
281
+ 'Authentication error %s: %s. Retrying.',
282
+ status_code,
283
+ text,
284
+ )
285
+ elif status_code == 403:
286
+ # Forbidden error
287
+ # Can occur when v2 endpoint is used while AI resource is configured # noqa: E501
288
+ # with disableLocalAuth
289
+ logger.warning(
290
+ 'Forbidden error %s: %s. Retrying.',
291
+ status_code,
292
+ text,
293
+ )
294
+ else:
295
+ logger.warning(
296
+ 'Transient server side error %s: %s. Retrying.',
297
+ status_code,
298
+ text,
299
+ )
300
+ if self._check_stats_collection():
301
+ _update_requests_map('retry', value=status_code)
302
+ return TransportStatusCode.RETRY
303
+ else:
304
+ # 400 and 404 will be tracked as failure count
305
+ # 400 - Invalid - The server cannot or will not process the request due to the invalid telemetry (invalid data, iKey) # noqa: E501
306
+ # 404 - Ingestion is allowed only from stamp specific endpoint - must update connection string # noqa: E501
307
+ if self._check_stats_collection():
308
+ _update_requests_map('failure', value=status_code)
309
+ # Other, server side error (non-retryable)
310
+ if not self._is_stats_exporter():
311
+ logger.error(
312
+ 'Non-retryable server side error %s: %s.',
313
+ status_code,
314
+ text,
315
+ )
316
+ return TransportStatusCode.DROP
317
+
318
+
319
+ def _status_code_is_redirect(status_code):
320
+ return status_code in REDIRECT_STATUS_CODES
321
+
322
+
323
+ def _status_code_is_throttle(status_code):
324
+ return status_code in THROTTLE_STATUS_CODES
325
+
326
+
327
+ def _status_code_is_retryable(status_code):
328
+ return status_code in RETRYABLE_STATUS_CODES
329
+
330
+
331
+ def _reached_ingestion_status_code(status_code):
332
+ return status_code in _REACHED_INGESTION_STATUS_CODES
333
+
334
+
335
+ def _statsbeat_failure_reached_threshold():
336
+ # increment failure counter for sending statsbeat if in initialization
337
+ state.increment_statsbeat_initial_failure_count()
338
+ return state.get_statsbeat_initial_failure_count() >= 3
339
+
340
+
341
+ def _update_requests_map(type_name, value=None):
342
+ # value is either None, duration, status_code or exc_name
343
+ with _requests_lock:
344
+ if type_name == "success" or type_name == "count": # success, count
345
+ _requests_map[type_name] = _requests_map.get(type_name, 0) + 1
346
+ elif type_name == "duration": # value will be duration
347
+ _requests_map[type_name] = _requests_map.get(type_name, 0) + value # noqa: E501
348
+ else: # exception, failure, retry, throttle
349
+ # value will be a key (status_code/exc_name)
350
+ prev = 0
351
+ if _requests_map.get(type_name):
352
+ prev = _requests_map.get(type_name).get(value, 0)
353
+ else:
354
+ _requests_map[type_name] = {}
355
+ _requests_map[type_name][value] = prev + 1