azure-storage-blob 12.25.0b1__tar.gz → 12.25.1__tar.gz

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 (201) hide show
  1. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/CHANGELOG.md +10 -0
  2. {azure_storage_blob-12.25.0b1/azure_storage_blob.egg-info → azure_storage_blob-12.25.1}/PKG-INFO +2 -2
  3. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/_shared/avro/avro_io.py +2 -2
  4. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/_shared/avro/avro_io_async.py +1 -1
  5. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/_shared/base_client.py +5 -2
  6. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/_shared/policies_async.py +1 -1
  7. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/_shared/request_handlers.py +1 -2
  8. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/_shared/uploads_async.py +2 -3
  9. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/_version.py +1 -1
  10. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/aio/_download_async.py +1 -1
  11. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1/azure_storage_blob.egg-info}/PKG-INFO +2 -2
  12. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/setup.py +1 -1
  13. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/test_common_blob.py +54 -0
  14. azure_storage_blob-12.25.1/tests/test_helpers.py +153 -0
  15. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/test_helpers_async.py +11 -12
  16. azure_storage_blob-12.25.0b1/tests/test_helpers.py +0 -42
  17. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/LICENSE +0 -0
  18. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/MANIFEST.in +0 -0
  19. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/README.md +0 -0
  20. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/__init__.py +0 -0
  21. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/__init__.py +0 -0
  22. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/__init__.py +0 -0
  23. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/_blob_client.py +0 -0
  24. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/_blob_client_helpers.py +0 -0
  25. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/_blob_service_client.py +0 -0
  26. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/_blob_service_client_helpers.py +0 -0
  27. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/_container_client.py +0 -0
  28. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/_container_client_helpers.py +0 -0
  29. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/_deserialize.py +0 -0
  30. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/_download.py +0 -0
  31. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/_encryption.py +0 -0
  32. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/_generated/__init__.py +0 -0
  33. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/_generated/_azure_blob_storage.py +0 -0
  34. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/_generated/_configuration.py +0 -0
  35. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/_generated/_patch.py +0 -0
  36. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/_generated/_serialization.py +0 -0
  37. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/_generated/aio/__init__.py +0 -0
  38. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/_generated/aio/_azure_blob_storage.py +0 -0
  39. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/_generated/aio/_configuration.py +0 -0
  40. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/_generated/aio/_patch.py +0 -0
  41. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/_generated/aio/operations/__init__.py +0 -0
  42. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/_generated/aio/operations/_append_blob_operations.py +0 -0
  43. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/_generated/aio/operations/_blob_operations.py +0 -0
  44. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/_generated/aio/operations/_block_blob_operations.py +0 -0
  45. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/_generated/aio/operations/_container_operations.py +0 -0
  46. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/_generated/aio/operations/_page_blob_operations.py +0 -0
  47. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/_generated/aio/operations/_patch.py +0 -0
  48. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/_generated/aio/operations/_service_operations.py +0 -0
  49. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/_generated/models/__init__.py +0 -0
  50. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/_generated/models/_azure_blob_storage_enums.py +0 -0
  51. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/_generated/models/_models_py3.py +0 -0
  52. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/_generated/models/_patch.py +0 -0
  53. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/_generated/operations/__init__.py +0 -0
  54. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/_generated/operations/_append_blob_operations.py +0 -0
  55. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/_generated/operations/_blob_operations.py +0 -0
  56. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/_generated/operations/_block_blob_operations.py +0 -0
  57. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/_generated/operations/_container_operations.py +0 -0
  58. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/_generated/operations/_page_blob_operations.py +0 -0
  59. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/_generated/operations/_patch.py +0 -0
  60. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/_generated/operations/_service_operations.py +0 -0
  61. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/_generated/py.typed +0 -0
  62. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/_lease.py +0 -0
  63. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/_list_blobs_helper.py +0 -0
  64. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/_models.py +0 -0
  65. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/_quick_query_helper.py +0 -0
  66. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/_serialize.py +0 -0
  67. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/_shared/__init__.py +0 -0
  68. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/_shared/authentication.py +0 -0
  69. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/_shared/avro/__init__.py +0 -0
  70. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/_shared/avro/datafile.py +0 -0
  71. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/_shared/avro/datafile_async.py +0 -0
  72. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/_shared/avro/schema.py +0 -0
  73. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/_shared/base_client_async.py +0 -0
  74. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/_shared/constants.py +0 -0
  75. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/_shared/models.py +0 -0
  76. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/_shared/parser.py +0 -0
  77. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/_shared/policies.py +0 -0
  78. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/_shared/response_handlers.py +0 -0
  79. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/_shared/shared_access_signature.py +0 -0
  80. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/_shared/uploads.py +0 -0
  81. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/_shared_access_signature.py +0 -0
  82. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/_upload_helpers.py +0 -0
  83. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/aio/__init__.py +0 -0
  84. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/aio/_blob_client_async.py +0 -0
  85. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/aio/_blob_service_client_async.py +0 -0
  86. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/aio/_container_client_async.py +0 -0
  87. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/aio/_encryption_async.py +0 -0
  88. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/aio/_lease_async.py +0 -0
  89. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/aio/_list_blobs_helper.py +0 -0
  90. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/aio/_models.py +0 -0
  91. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/aio/_upload_helpers.py +0 -0
  92. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure/storage/blob/py.typed +0 -0
  93. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure_storage_blob.egg-info/SOURCES.txt +0 -0
  94. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure_storage_blob.egg-info/dependency_links.txt +0 -0
  95. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure_storage_blob.egg-info/not-zip-safe +0 -0
  96. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure_storage_blob.egg-info/requires.txt +0 -0
  97. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/azure_storage_blob.egg-info/top_level.txt +0 -0
  98. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/migration_guide.md +0 -0
  99. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/pyproject.toml +0 -0
  100. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/samples/README.md +0 -0
  101. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/samples/blob_samples_authentication.py +0 -0
  102. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/samples/blob_samples_authentication_async.py +0 -0
  103. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/samples/blob_samples_batch_delete_blobs.py +0 -0
  104. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/samples/blob_samples_client_side_encryption.py +0 -0
  105. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/samples/blob_samples_client_side_encryption_keyvault.py +0 -0
  106. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/samples/blob_samples_common.py +0 -0
  107. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/samples/blob_samples_common_async.py +0 -0
  108. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/samples/blob_samples_container_access_policy.py +0 -0
  109. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/samples/blob_samples_container_access_policy_async.py +0 -0
  110. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/samples/blob_samples_containers.py +0 -0
  111. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/samples/blob_samples_containers_async.py +0 -0
  112. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/samples/blob_samples_copy_blob.py +0 -0
  113. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/samples/blob_samples_copy_blob_async.py +0 -0
  114. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/samples/blob_samples_directory_interface.py +0 -0
  115. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/samples/blob_samples_directory_interface_mimetype.py +0 -0
  116. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/samples/blob_samples_enumerate_blobs.py +0 -0
  117. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/samples/blob_samples_enumerate_blobs_async.py +0 -0
  118. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/samples/blob_samples_hello_world.py +0 -0
  119. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/samples/blob_samples_hello_world_async.py +0 -0
  120. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/samples/blob_samples_network_activity_logging.py +0 -0
  121. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/samples/blob_samples_proxy_configuration.py +0 -0
  122. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/samples/blob_samples_query.py +0 -0
  123. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/samples/blob_samples_service.py +0 -0
  124. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/samples/blob_samples_service_async.py +0 -0
  125. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/samples/blob_samples_walk_blob_hierarchy.py +0 -0
  126. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/samples/blob_samples_walk_blob_hierarchy_async.py +0 -0
  127. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/setup.cfg +0 -0
  128. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/avro/__init__.py +0 -0
  129. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/avro/test_avro.py +0 -0
  130. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/avro/test_avro_async.py +0 -0
  131. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/conftest.py +0 -0
  132. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/encryption_test_helper.py +0 -0
  133. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/fake_credentials.py +0 -0
  134. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/perfstress_tests/T1_legacy_tests/__init__.py +0 -0
  135. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/perfstress_tests/T1_legacy_tests/_test_base_legacy.py +0 -0
  136. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/perfstress_tests/T1_legacy_tests/download.py +0 -0
  137. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/perfstress_tests/T1_legacy_tests/list_blobs.py +0 -0
  138. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/perfstress_tests/T1_legacy_tests/upload.py +0 -0
  139. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/perfstress_tests/T1_legacy_tests/upload_block.py +0 -0
  140. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/perfstress_tests/T1_legacy_tests/upload_from_file.py +0 -0
  141. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/perfstress_tests/__init__.py +0 -0
  142. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/perfstress_tests/_test_base.py +0 -0
  143. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/perfstress_tests/download.py +0 -0
  144. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/perfstress_tests/key_wrapper.py +0 -0
  145. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/perfstress_tests/list_blobs.py +0 -0
  146. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/perfstress_tests/upload.py +0 -0
  147. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/perfstress_tests/upload_block.py +0 -0
  148. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/perfstress_tests/upload_from_file.py +0 -0
  149. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/settings/__init__.py +0 -0
  150. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/settings/settings_fake.py +0 -0
  151. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/settings/testcase.py +0 -0
  152. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/test_append_blob.py +0 -0
  153. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/test_append_blob_async.py +0 -0
  154. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/test_blob_access_conditions.py +0 -0
  155. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/test_blob_access_conditions_async.py +0 -0
  156. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/test_blob_api_version.py +0 -0
  157. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/test_blob_api_version_async.py +0 -0
  158. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/test_blob_client.py +0 -0
  159. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/test_blob_client_async.py +0 -0
  160. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/test_blob_encryption.py +0 -0
  161. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/test_blob_encryption_async.py +0 -0
  162. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/test_blob_encryption_v2.py +0 -0
  163. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/test_blob_encryption_v2_async.py +0 -0
  164. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/test_blob_retry.py +0 -0
  165. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/test_blob_retry_async.py +0 -0
  166. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/test_blob_service_properties.py +0 -0
  167. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/test_blob_service_properties_async.py +0 -0
  168. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/test_blob_service_stats.py +0 -0
  169. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/test_blob_service_stats_async.py +0 -0
  170. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/test_blob_storage_account.py +0 -0
  171. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/test_blob_storage_account_async.py +0 -0
  172. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/test_blob_tags.py +0 -0
  173. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/test_blob_tags_async.py +0 -0
  174. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/test_block_blob.py +0 -0
  175. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/test_block_blob_async.py +0 -0
  176. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/test_block_blob_sync_copy.py +0 -0
  177. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/test_block_blob_sync_copy_async.py +0 -0
  178. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/test_common_blob_async.py +0 -0
  179. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/test_container.py +0 -0
  180. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/test_container_async.py +0 -0
  181. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/test_cpk.py +0 -0
  182. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/test_cpk_async.py +0 -0
  183. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/test_cpk_n.py +0 -0
  184. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/test_cpk_n_async.py +0 -0
  185. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/test_dictmixin.py +0 -0
  186. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/test_get_blob.py +0 -0
  187. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/test_get_blob_async.py +0 -0
  188. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/test_large_block_blob.py +0 -0
  189. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/test_large_block_blob_async.py +0 -0
  190. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/test_largest_block_blob.py +0 -0
  191. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/test_largest_block_blob_async.py +0 -0
  192. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/test_logging.py +0 -0
  193. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/test_logging_async.py +0 -0
  194. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/test_ors.py +0 -0
  195. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/test_ors_async.py +0 -0
  196. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/test_page_blob.py +0 -0
  197. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/test_page_blob_async.py +0 -0
  198. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/test_quick_query.py +0 -0
  199. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/test_retry.py +0 -0
  200. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/test_retry_async.py +0 -0
  201. {azure_storage_blob-12.25.0b1 → azure_storage_blob-12.25.1}/tests/test_upload_chunking.py +0 -0
@@ -1,5 +1,15 @@
1
1
  # Release History
2
2
 
3
+ ## 12.25.1 (2025-03-27)
4
+
5
+ ### Other Changes
6
+ - Updated dependency for `azure-storage-file-datalake` type hints.
7
+
8
+ ## 12.25.0 (2025-03-11)
9
+
10
+ ### Features Added
11
+ - Stable release of features from 12.25.0b1
12
+
3
13
  ## 12.25.0b1 (2025-02-11)
4
14
 
5
15
  ### Features Added
@@ -1,13 +1,13 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: azure-storage-blob
3
- Version: 12.25.0b1
3
+ Version: 12.25.1
4
4
  Summary: Microsoft Azure Blob Storage Client Library for Python
5
5
  Home-page: https://github.com/Azure/azure-sdk-for-python/tree/main/sdk/storage/azure-storage-blob
6
6
  Author: Microsoft Corporation
7
7
  Author-email: ascl@microsoft.com
8
8
  License: MIT License
9
9
  Keywords: azure,azure sdk
10
- Classifier: Development Status :: 4 - Beta
10
+ Classifier: Development Status :: 5 - Production/Stable
11
11
  Classifier: Programming Language :: Python
12
12
  Classifier: Programming Language :: Python :: 3 :: Only
13
13
  Classifier: Programming Language :: Python :: 3
@@ -162,11 +162,11 @@ class BinaryDecoder(object):
162
162
  try:
163
163
  return input_bytes.decode('utf-8')
164
164
  except UnicodeDecodeError as exn:
165
- logger.error('Invalid UTF-8 input bytes: %r', input_bytes)
165
+ logger.error('Invalid UTF-8 input bytes: %r', input_bytes) # pylint: disable=do-not-log-raised-errors
166
166
  raise exn
167
167
  else:
168
168
  # PY2
169
- return unicode(input_bytes, "utf-8") # pylint: disable=undefined-variable
169
+ return unicode(input_bytes, "utf-8") # pylint: disable=undefined-variable
170
170
 
171
171
  def skip_null(self):
172
172
  pass
@@ -145,7 +145,7 @@ class AsyncBinaryDecoder(object):
145
145
  try:
146
146
  return input_bytes.decode('utf-8')
147
147
  except UnicodeDecodeError as exn:
148
- logger.error('Invalid UTF-8 input bytes: %r', input_bytes)
148
+ logger.error('Invalid UTF-8 input bytes: %r', input_bytes) # pylint: disable=do-not-log-raised-errors
149
149
  raise exn
150
150
  else:
151
151
  # PY2
@@ -65,7 +65,10 @@ _SERVICE_PARAMS = {
65
65
 
66
66
 
67
67
  class StorageAccountHostsMixin(object):
68
+
68
69
  _client: Any
70
+ _hosts: Dict[str, str]
71
+
69
72
  def __init__(
70
73
  self,
71
74
  parsed_url: Any,
@@ -74,7 +77,7 @@ class StorageAccountHostsMixin(object):
74
77
  **kwargs: Any
75
78
  ) -> None:
76
79
  self._location_mode = kwargs.get("_location_mode", LocationMode.PRIMARY)
77
- self._hosts = kwargs.get("_hosts")
80
+ self._hosts = kwargs.get("_hosts", {})
78
81
  self.scheme = parsed_url.scheme
79
82
  self._is_localhost = False
80
83
 
@@ -93,7 +96,7 @@ class StorageAccountHostsMixin(object):
93
96
  if self.scheme.lower() != "https" and hasattr(self.credential, "get_token"):
94
97
  raise ValueError("Token credential is only supported with HTTPS.")
95
98
 
96
- secondary_hostname = None
99
+ secondary_hostname = ""
97
100
  if hasattr(self.credential, "account_name"):
98
101
  self.account_name = self.credential.account_name
99
102
  secondary_hostname = f"{self.credential.account_name}-secondary.{service_name}.{SERVICE_HOST_BASE}"
@@ -5,7 +5,7 @@
5
5
  # --------------------------------------------------------------------------
6
6
  # pylint: disable=invalid-overridden-method
7
7
 
8
- import asyncio
8
+ import asyncio # pylint: disable=do-not-import-asyncio
9
9
  import logging
10
10
  import random
11
11
  from typing import Any, Dict, TYPE_CHECKING
@@ -136,8 +136,7 @@ def validate_and_format_range_headers(
136
136
  return range_header, range_validation
137
137
 
138
138
 
139
- def add_metadata_headers(metadata=None):
140
- # type: (Optional[Dict[str, str]]) -> Dict[str, str]
139
+ def add_metadata_headers(metadata: Optional[Dict[str, str]] = None) -> Dict[str, str]:
141
140
  headers = {}
142
141
  if metadata:
143
142
  for key, value in metadata.items():
@@ -4,10 +4,9 @@
4
4
  # license information.
5
5
  # --------------------------------------------------------------------------
6
6
 
7
- import asyncio
7
+ import asyncio # pylint: disable=do-not-import-asyncio
8
8
  import inspect
9
9
  import threading
10
- from asyncio import Lock
11
10
  from io import UnsupportedOperation
12
11
  from itertools import islice
13
12
  from math import ceil
@@ -165,7 +164,7 @@ class _ChunkUploader(object): # pylint: disable=too-many-instance-attributes
165
164
 
166
165
  # Progress feedback
167
166
  self.progress_total = 0
168
- self.progress_lock = Lock() if parallel else None
167
+ self.progress_lock = asyncio.Lock() if parallel else None
169
168
  self.progress_hook = progress_hook
170
169
 
171
170
  # Encryption
@@ -4,4 +4,4 @@
4
4
  # license information.
5
5
  # --------------------------------------------------------------------------
6
6
 
7
- VERSION = "12.25.0b1"
7
+ VERSION = "12.25.1"
@@ -6,7 +6,7 @@
6
6
  # pylint: disable=invalid-overridden-method
7
7
  # mypy: disable-error-code=override
8
8
 
9
- import asyncio
9
+ import asyncio # pylint: disable=do-not-import-asyncio
10
10
  import codecs
11
11
  import sys
12
12
  import warnings
@@ -1,13 +1,13 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: azure-storage-blob
3
- Version: 12.25.0b1
3
+ Version: 12.25.1
4
4
  Summary: Microsoft Azure Blob Storage Client Library for Python
5
5
  Home-page: https://github.com/Azure/azure-sdk-for-python/tree/main/sdk/storage/azure-storage-blob
6
6
  Author: Microsoft Corporation
7
7
  Author-email: ascl@microsoft.com
8
8
  License: MIT License
9
9
  Keywords: azure,azure sdk
10
- Classifier: Development Status :: 4 - Beta
10
+ Classifier: Development Status :: 5 - Production/Stable
11
11
  Classifier: Programming Language :: Python
12
12
  Classifier: Programming Language :: Python :: 3 :: Only
13
13
  Classifier: Programming Language :: Python :: 3
@@ -56,7 +56,7 @@ setup(
56
56
  url='https://github.com/Azure/azure-sdk-for-python/tree/main/sdk/storage/azure-storage-blob',
57
57
  keywords="azure, azure sdk",
58
58
  classifiers=[
59
- 'Development Status :: 4 - Beta',
59
+ 'Development Status :: 5 - Production/Stable',
60
60
  'Programming Language :: Python',
61
61
  'Programming Language :: Python :: 3 :: Only',
62
62
  'Programming Language :: Python :: 3',
@@ -53,6 +53,7 @@ from azure.storage.blob._generated.models import RehydratePriority
53
53
  from devtools_testutils import FakeTokenCredential, recorded_by_proxy
54
54
  from devtools_testutils.storage import StorageRecordedTestCase
55
55
  from settings.testcase import BlobPreparer
56
+ from test_helpers import MockStorageTransport
56
57
 
57
58
  # ------------------------------------------------------------------------------
58
59
  TEST_CONTAINER_PREFIX = 'container'
@@ -3531,4 +3532,57 @@ class TestStorageCommonBlob(StorageRecordedTestCase):
3531
3532
  result = blob.download_blob().readall()
3532
3533
  assert result == data[:length]
3533
3534
 
3535
+ @BlobPreparer()
3536
+ def test_mock_transport_no_content_validation(self, **kwargs):
3537
+ storage_account_name = kwargs.pop("storage_account_name")
3538
+ storage_account_key = kwargs.pop("storage_account_key")
3539
+
3540
+ transport = MockStorageTransport()
3541
+ blob_client = BlobClient(
3542
+ self.account_url(storage_account_name, "blob"),
3543
+ container_name='test_cont',
3544
+ blob_name='test_blob',
3545
+ credential=storage_account_key,
3546
+ transport=transport,
3547
+ retry_total=0
3548
+ )
3549
+
3550
+ content = blob_client.download_blob()
3551
+ assert content is not None
3552
+
3553
+ props = blob_client.get_blob_properties()
3554
+ assert props is not None
3555
+
3556
+ data = b"Hello World!"
3557
+ resp = blob_client.upload_blob(data, overwrite=True)
3558
+ assert resp is not None
3559
+
3560
+ blob_data = blob_client.download_blob().read()
3561
+ assert blob_data == b"Hello World!" # data is fixed by mock transport
3562
+
3563
+ resp = blob_client.delete_blob()
3564
+ assert resp is None
3565
+
3566
+ @BlobPreparer()
3567
+ def test_mock_transport_with_content_validation(self, **kwargs):
3568
+ storage_account_name = kwargs.pop("storage_account_name")
3569
+ storage_account_key = kwargs.pop("storage_account_key")
3570
+
3571
+ transport = MockStorageTransport()
3572
+ blob_client = BlobClient(
3573
+ self.account_url(storage_account_name, "blob"),
3574
+ container_name='test_cont',
3575
+ blob_name='test_blob',
3576
+ credential=storage_account_key,
3577
+ transport=transport,
3578
+ retry_total=0
3579
+ )
3580
+
3581
+ data = b"Hello World!"
3582
+ resp = blob_client.upload_blob(data, overwrite=True, validate_content=True)
3583
+ assert resp is not None
3584
+
3585
+ blob_data = blob_client.download_blob(validate_content=True).read()
3586
+ assert blob_data == b"Hello World!" # data is fixed by mock transport
3587
+
3534
3588
  # ------------------------------------------------------------------------------
@@ -0,0 +1,153 @@
1
+ # -------------------------------------------------------------------------
2
+ # Copyright (c) Microsoft Corporation. All rights reserved.
3
+ # Licensed under the MIT License. See License.txt in the project root for
4
+ # license information.
5
+ # --------------------------------------------------------------------------
6
+
7
+ from io import IOBase, UnsupportedOperation
8
+ from typing import Any, Dict, Optional
9
+ from typing_extensions import Self
10
+
11
+ from azure.core.pipeline.transport import HttpTransport, RequestsTransportResponse
12
+ from azure.core.rest import HttpRequest
13
+ from requests import Response
14
+ from urllib3 import HTTPResponse
15
+
16
+
17
+ class ProgressTracker:
18
+ def __init__(self, total: int, step: int):
19
+ self.total = total
20
+ self.step = step
21
+ self.current = 0
22
+
23
+ def assert_progress(self, current: int, total: Optional[int]):
24
+ if self.current != self.total:
25
+ self.current += self.step
26
+
27
+ if total:
28
+ assert self.total == total
29
+ assert self.current == current
30
+
31
+ def assert_complete(self):
32
+ assert self.total == self.current
33
+
34
+
35
+ class NonSeekableStream(IOBase):
36
+ def __init__(self, wrapped_stream):
37
+ self.wrapped_stream = wrapped_stream
38
+
39
+ def write(self, data):
40
+ return self.wrapped_stream.write(data)
41
+
42
+ def read(self, count):
43
+ return self.wrapped_stream.read(count)
44
+
45
+ def seek(self, *args, **kwargs):
46
+ raise UnsupportedOperation("boom!")
47
+
48
+ def tell(self):
49
+ return self.wrapped_stream.tell()
50
+
51
+
52
+ class MockHttpClientResponse(Response):
53
+ def __init__(
54
+ self, url: str,
55
+ body_bytes: bytes,
56
+ headers: Dict[str, Any],
57
+ status: int = 200,
58
+ reason: str = "OK"
59
+ ) -> None:
60
+ super(MockHttpClientResponse).__init__()
61
+ self._url = url
62
+ self._body = body_bytes
63
+ self._content = body_bytes
64
+ self._cache = {}
65
+ self._loop = None
66
+ self._content_consumed = True
67
+ self.headers = headers
68
+ self.status_code = status
69
+ self.reason = reason
70
+ self.raw = HTTPResponse()
71
+
72
+
73
+ class MockStorageTransport(HttpTransport):
74
+ """
75
+ This transport returns legacy http response objects from azure core and is
76
+ intended only to test our backwards compatibility support.
77
+ """
78
+ def send(self, request: HttpRequest, **kwargs: Any) -> RequestsTransportResponse:
79
+ if request.method == 'GET':
80
+ # download_blob
81
+ headers = {
82
+ "Content-Type": "application/octet-stream",
83
+ "Content-Range": "bytes 0-17/18",
84
+ "Content-Length": "18",
85
+ }
86
+
87
+ if "x-ms-range-get-content-md5" in request.headers:
88
+ headers["Content-MD5"] = "7Qdih1MuhjZehB6Sv8UNjA==" # cspell:disable-line
89
+
90
+ rest_response = RequestsTransportResponse(
91
+ request=request,
92
+ requests_response=MockHttpClientResponse(
93
+ request.url,
94
+ b"Hello World!",
95
+ headers,
96
+ )
97
+ )
98
+ elif request.method == 'HEAD':
99
+ # get_blob_properties
100
+ rest_response = RequestsTransportResponse(
101
+ request=request,
102
+ requests_response=MockHttpClientResponse(
103
+ request.url,
104
+ b"",
105
+ {
106
+ "Content-Type": "application/octet-stream",
107
+ "Content-Length": "1024",
108
+ },
109
+ )
110
+ )
111
+ elif request.method == 'PUT':
112
+ # upload_blob
113
+ rest_response = RequestsTransportResponse(
114
+ request=request,
115
+ requests_response=MockHttpClientResponse(
116
+ request.url,
117
+ b"",
118
+ {
119
+ "Content-Length": "0",
120
+ },
121
+ 201,
122
+ "Created"
123
+ )
124
+ )
125
+ elif request.method == 'DELETE':
126
+ # delete_blob
127
+ rest_response = RequestsTransportResponse(
128
+ request=request,
129
+ requests_response=MockHttpClientResponse(
130
+ request.url,
131
+ b"",
132
+ {
133
+ "Content-Length": "0",
134
+ },
135
+ 202,
136
+ "Accepted"
137
+ )
138
+ )
139
+ else:
140
+ raise ValueError("The request is not accepted as part of MockStorageTransport.")
141
+ return rest_response
142
+
143
+ def __enter__(self) -> Self:
144
+ return self
145
+
146
+ def __exit__(self, *args: Any) -> None:
147
+ pass
148
+
149
+ def open(self) -> None:
150
+ pass
151
+
152
+ def close(self) -> None:
153
+ pass
@@ -6,9 +6,8 @@
6
6
  from io import IOBase, UnsupportedOperation
7
7
  from typing import Any, Dict, Optional
8
8
 
9
- from azure.core.pipeline.transport import AsyncHttpTransport
9
+ from azure.core.pipeline.transport import AioHttpTransportResponse, AsyncHttpTransport
10
10
  from azure.core.rest import HttpRequest
11
- from azure.core.rest._aiohttp import RestAioHttpTransportResponse
12
11
  from aiohttp import ClientResponse
13
12
 
14
13
 
@@ -90,7 +89,7 @@ class MockStorageTransport(AsyncHttpTransport):
90
89
  This transport returns legacy http response objects from azure core and is
91
90
  intended only to test our backwards compatibility support.
92
91
  """
93
- async def send(self, request: HttpRequest, **kwargs: Any) -> RestAioHttpTransportResponse:
92
+ async def send(self, request: HttpRequest, **kwargs: Any) -> AioHttpTransportResponse:
94
93
  if request.method == 'GET':
95
94
  # download_blob
96
95
  headers = {
@@ -102,9 +101,9 @@ class MockStorageTransport(AsyncHttpTransport):
102
101
  if "x-ms-range-get-content-md5" in request.headers:
103
102
  headers["Content-MD5"] = "I3pVbaOCUTom+G9F9uKFoA=="
104
103
 
105
- rest_response = RestAioHttpTransportResponse(
104
+ rest_response = AioHttpTransportResponse(
106
105
  request=request,
107
- internal_response=MockAioHttpClientResponse(
106
+ aiohttp_response=MockAioHttpClientResponse(
108
107
  request.url,
109
108
  b"Hello Async World!",
110
109
  headers,
@@ -113,9 +112,9 @@ class MockStorageTransport(AsyncHttpTransport):
113
112
  )
114
113
  elif request.method == 'HEAD':
115
114
  # get_blob_properties
116
- rest_response = RestAioHttpTransportResponse(
115
+ rest_response = AioHttpTransportResponse(
117
116
  request=request,
118
- internal_response=MockAioHttpClientResponse(
117
+ aiohttp_response=MockAioHttpClientResponse(
119
118
  request.url,
120
119
  b"",
121
120
  {
@@ -127,9 +126,9 @@ class MockStorageTransport(AsyncHttpTransport):
127
126
  )
128
127
  elif request.method == 'PUT':
129
128
  # upload_blob
130
- rest_response = RestAioHttpTransportResponse(
129
+ rest_response = AioHttpTransportResponse(
131
130
  request=request,
132
- internal_response=MockAioHttpClientResponse(
131
+ aiohttp_response=MockAioHttpClientResponse(
133
132
  request.url,
134
133
  b"",
135
134
  {
@@ -142,9 +141,9 @@ class MockStorageTransport(AsyncHttpTransport):
142
141
  )
143
142
  elif request.method == 'DELETE':
144
143
  # delete_blob
145
- rest_response = RestAioHttpTransportResponse(
144
+ rest_response = AioHttpTransportResponse(
146
145
  request=request,
147
- internal_response=MockAioHttpClientResponse(
146
+ aiohttp_response=MockAioHttpClientResponse(
148
147
  request.url,
149
148
  b"",
150
149
  {
@@ -158,7 +157,7 @@ class MockStorageTransport(AsyncHttpTransport):
158
157
  else:
159
158
  raise ValueError("The request is not accepted as part of MockStorageTransport.")
160
159
 
161
- await rest_response.read()
160
+ await rest_response.load_body()
162
161
  return rest_response
163
162
 
164
163
  async def __aenter__(self):
@@ -1,42 +0,0 @@
1
- # -------------------------------------------------------------------------
2
- # Copyright (c) Microsoft Corporation. All rights reserved.
3
- # Licensed under the MIT License. See License.txt in the project root for
4
- # license information.
5
- # --------------------------------------------------------------------------
6
- from io import IOBase, UnsupportedOperation
7
- from typing import Optional
8
-
9
-
10
- class ProgressTracker:
11
- def __init__(self, total: int, step: int):
12
- self.total = total
13
- self.step = step
14
- self.current = 0
15
-
16
- def assert_progress(self, current: int, total: Optional[int]):
17
- if self.current != self.total:
18
- self.current += self.step
19
-
20
- if total:
21
- assert self.total == total
22
- assert self.current == current
23
-
24
- def assert_complete(self):
25
- assert self.total == self.current
26
-
27
-
28
- class NonSeekableStream(IOBase):
29
- def __init__(self, wrapped_stream):
30
- self.wrapped_stream = wrapped_stream
31
-
32
- def write(self, data):
33
- return self.wrapped_stream.write(data)
34
-
35
- def read(self, count):
36
- return self.wrapped_stream.read(count)
37
-
38
- def seek(self, *args, **kwargs):
39
- raise UnsupportedOperation("boom!")
40
-
41
- def tell(self):
42
- return self.wrapped_stream.tell()