Skip to content

Commit

Permalink
Azure Storage File Track2 (#6106)
Browse files Browse the repository at this point in the history
* Files Skeleton (#5921)

* Generate storage files autorest layer (#5926)

* Generate autorest layer

* oops

* Rename files to file

* [Storage Files] API skeleton with helper files (#5965)

* Hookup File Service Client (#5977)

* Hookup share client (#6000)

* commit1

* Hook up Share Client

* Directory client hookup + File client  Hookup (#6040)

* file hookup

* changes

* [storage-files]Started adding files tests (#6051)

* Updated shared module

* Added tests

* First test pass

* Fixed client tests

* Fixed service props tests

* share tests (#6084)

* random commit

* share tests

* changes

* revert to fake settings

* Updates for file client tests

* Merged clients

* Fixed tests

* Recorded tests

* Clean test pass

* Packaging update of azure-storage-file

* Fixed acl test

* Fixed copy test

* More recordings

* Fixed copy recordings

* Fixed directory test

* Added close handles

* Updated packaging

* Updated user agent policy

* Updated dependencies

* Fixed handles tests

* Fixed syntax

* Files dependency conflict

* docstrings for files (#6128)

* Storage-File readme (#6156)

* adds file readme

* fix anchor for upload file

* Removed Py3.4 tag

* Clean pylint

* Fixed generated models

* Code samples for files (#6159)

* adds code samples for files

* fixes recording

* fixes code samples and adds literalincludes for docs

* fix links for readme

* Fix CI

* [storage-file] Docs updates (#6189)

* Fix failure to parse UTF8 files with BOM (#6160)

* Fix failure to parse UTF8 files with BOM

* Match frozen requirements in cosmos

* build universal wheels (#6173)

* Batch of doc

* Typo

* Update README and HISTORY of EventHub (#6151)

* Update readme

* Update sample code, obtain connection string and documentation reference in readme

* Remove import os in readme

* Added identity snippets in readme

* Update history, readme and license

* Update history

* Update history of EventHub

* Fix wrong version

* Update history of EventHub

* Update history to be more specific

* Update install command in readme for a preview version

* Update reference documentation link in readme

* don't scan anything under doc/ (#6185)

* Docs updates

* Some docs fixes

* Expand test coverage (#6170)

* Fixed model reference

* Fixed another reference

* Azure Storage Queue Track2 (#6039)

* Initial commit for Queues (#5656)

* Initial commit

* fix build

* fix build - 2

* add version

* API buildout (#5686)

* [Storage Queues] Add autorest layer to storage queues (#5687)

* add queue.json in swagger

* Add autorest layer

* Hooking up Queue client and Queue Service Client (#5817)

* Queue client

* changes

* shared access signature

* some fixes

* add tests

* Delete settings_real.py

* Refactored shared code and added tests

* Packaging update of azure-storage-queue

* Revert "Packaging update of azure-storage-queue"

This reverts commit fdc62ab.

* Add packaging overwrite

* Fixed setup

* Fixed dependency

* Storage Queues readme (#6073)

* queues readme [wip]

* small fixes

* docstrings for queues (#6066)

* Updated user-agent policy

* Updated token test

* Updated message iterator to pageable

* Renamed dequeue to receive

* Removed Py3.4 tag

* Clean pylint

* Code samples for queues (#6088)

* adds code samples for queues

* fixes to code samples and adds literalincludes for docs

* add links for TODO

* uses unicode strings for python2 compatibility

* fix readme link

* Fix CI

* [Storage Queue] pylint  + mypy pass (#6187)

* [storage-queue] Docs updates (#6186)

* Docs updates

* First round review feedback

* Adopt MSAL 0.4.1 (#6176)

* Azure Storage Blob Track2 (#5896)

* Storage blob track2 (#5894)

* Blob storage track 2

* Started pylint fixes

* Clean pylint

* Started blob walk

* Started docstrings

* Support walk blob

* Pylint

* Refactored upload

* Pylint

* Packaging update of azure-storage-blob

* Fixes to storage dependencies in CI (#5900)

* Revert "Packaging update of azure-storage-blob"

This reverts commit aeeb3ce.

* Fix Storage CI

* Fixed imports

* updating ccount_key_arg -> account_key_arg

* updating ordering

* Packaging update of azure-storage-blob

* Revert "Packaging update of azure-storage-blob"

This reverts commit 66d6877.

* reverting 66d6877. adding sdk_packaging.toml file

* docstrings for blobs (#5954)

* [storage-blob] Refactor shared code (#5960)

* Fix Storage CI

* Fixed imports

* Refactor shared storage code

* Fixed XML error

* Reverted change to models

* Merged models docstrings

* Fix setup.py version

* Missing recordings

* Fix storage SDK conflict

* Packaging update of azure-eventhubs

* Revert "Packaging update of azure-eventhubs"

This reverts commit df844f7.

* Fix EH packaging

* Updated shared code

* Review feedback

* [azure-storage-blob] Policy updates + simple upload/download (#6162)

* Last blob updates

* Azure core dependency version

* Update to user-agent policy

* Review feedback

* Removed old python tags

* Code samples for blobs (#6093)

* adds code samples for blobs

* fixes blob code samples and adds literalincludes for docs

* Storage Blobs Readme [wip] (#6011)

* blobs readme wip

* adding some samples and fixes for readme

* fix settings import

* moving code samples to a different PR

* small fixes to readme

* fill links for pypi and identity

* populating TODO links

* Fix CI

* [Storage Blob] pylint + mypy passs (#6175)

* pylint + mypy passs

* comments

* [storage-blob] Docs updates (#6184)

* Docs updates

* Some docstring fixes

* [storage-blob] Test rename (#6197)

* Test rename

* Removed test init files

* More renames

* Try flattening tests

* Blob test imports

* Flattened queue tests

* Renamed queue test case

* Updated manifest

* Renamed testcase

* Renamed samples

* Flattened tests

* Update PyPI package links on readme Key Vault (#6194)

* Renamed recordings

* fixes sample readme links (#6198)

* [azure-storage] Missing crypto dependency (#6203)

* [azure-storage] Missing crypto dependency

* Updated queue setup with crypto

* Fixed blob nspkg dependency

* Fixed queue nspkg dependency

* Added storage nspkg to shared deps

* Fixed dependencies

* Separate settings files

* [Storage File] pylint + mypy pass (#6202)
  • Loading branch information
annatisch authored Jul 3, 2019
1 parent eaf7df8 commit 1f02e1b
Show file tree
Hide file tree
Showing 232 changed files with 91,078 additions and 12 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,8 @@ src/build
adlEnv/

code_reports

# Azure Storage test credentials
sdk/storage/azure-storage-blob/tests/settings_real.py
sdk/storage/azure-storage-queue/tests/settings_real.py
sdk/storage/azure-storage-file/tests/settings_real.py
51 changes: 51 additions & 0 deletions sdk/storage/azure-storage-blob/tests/blob_settings_fake.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
# -------------------------------------------------------------------------
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License. See License.txt in the project root for
# license information.
# --------------------------------------------------------------------------

# NOTE: these keys are fake, but valid base-64 data, they were generated using:
# base64.b64encode(os.urandom(64))

STORAGE_ACCOUNT_NAME = "storagename"
STORAGE_ACCOUNT_KEY = "NzhL3hKZbJBuJ2484dPTR+xF30kYaWSSCbs2BzLgVVI1woqeST/1IgqaLm6QAOTxtGvxctSNbIR/1hW8yH+bJg=="
BLOB_STORAGE_ACCOUNT_NAME = "blobstoragename"
BLOB_STORAGE_ACCOUNT_KEY = "NzhL3hKZbJBuJ2484dPTR+xF30kYaWSSCbs2BzLgVVI1woqeST/1IgqaLm6QAOTxtGvxctSNbIR/1hW8yH+bJg=="
REMOTE_STORAGE_ACCOUNT_NAME = "storagename"
REMOTE_STORAGE_ACCOUNT_KEY = "NzhL3hKZbJBuJ2484dPTR+xF30kYaWSSCbs2BzLgVVI1woqeST/1IgqaLm6QAOTxtGvxctSNbIR/1hW8yH+bJg=="
PREMIUM_STORAGE_ACCOUNT_NAME = "premiumstoragename"
PREMIUM_STORAGE_ACCOUNT_KEY = "NzhL3hKZbJBuJ2484dPTR+xF30kYaWSSCbs2BzLgVVI1woqeST/1IgqaLm6QAOTxtGvxctSNbIR/1hW8yH+bJg=="
OAUTH_STORAGE_ACCOUNT_NAME = "oauthstoragename"
OAUTH_STORAGE_ACCOUNT_KEY = "XBB/YoZ41bDFBW1VcgCBNYmA1PDlc3NvQQaCk2rb/JtBoMBlekznQwAzDJHvZO1gJmCh8CUT12Gv3aCkWaDeGA=="

# Configurations related to Active Directory, which is used to obtain a token credential
ACTIVE_DIRECTORY_APPLICATION_ID = "68390a19-a897-236b-b453-488abf67b4fc"
ACTIVE_DIRECTORY_APPLICATION_SECRET = "3Ujhg7pzkOeE7flc6Z187ugf5/cJnszGPjAiXmcwhaY="
ACTIVE_DIRECTORY_TENANT_ID = "32f988bf-54f1-15af-36ab-2d7cd364db47"

# Use instead of STORAGE_ACCOUNT_NAME and STORAGE_ACCOUNT_KEY if custom settings are needed
CONNECTION_STRING = "DefaultEndpointsProtocol=https;AccountName=storagename;AccountKey=NzhL3hKZbJBuJ2484dPTR+xF30kYaWSSCbs2BzLgVVI1woqeST/1IgqaLm6QAOTxtGvxctSNbIR/1hW8yH+bJg==;EndpointSuffix=core.windows.net"
BLOB_CONNECTION_STRING = "DefaultEndpointsProtocol=https;AccountName=blobstoragename;AccountKey=NzhL3hKZbJBuJ2484dPTR+xF30kYaWSSCbs2BzLgVVI1woqeST/1IgqaLm6QAOTxtGvxctSNbIR/1hW8yH+bJg==;EndpointSuffix=core.windows.net"
PREMIUM_CONNECTION_STRING = "DefaultEndpointsProtocol=https;AccountName=premiumstoragename;AccountKey=NzhL3hKZbJBuJ2484dPTR+xF30kYaWSSCbs2BzLgVVI1woqeST/1IgqaLm6QAOTxtGvxctSNbIR/1hW8yH+bJg==;EndpointSuffix=core.windows.net"
# Use 'https' or 'http' protocol for sending requests, 'https' highly recommended
PROTOCOL = "https"

# Set to true if server side file encryption is enabled
IS_SERVER_SIDE_FILE_ENCRYPTION_ENABLED = True

# Decide which test mode to run against. Possible options:
# - Playback: run against stored recordings
# - Record: run tests against live storage and update recordings
# - RunLiveNoRecord: run tests against live storage without altering recordings
TEST_MODE = 'Playback'

# Set to true to enable logging for the tests
# logging is not enabled by default because it pollutes the CI logs
ENABLE_LOGGING = False

# Set up proxy support
USE_PROXY = False
PROXY_HOST = "192.168.15.116"
PROXY_PORT = "8118"
PROXY_USER = ""
PROXY_PASSWORD = ""
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
try:
import settings_real as settings
except ImportError:
import settings_fake as settings
import blob_settings_fake as settings

from testcase import (
StorageTestCase,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
try:
import settings_real as settings
except ImportError:
import settings_fake as settings
import blob_settings_fake as settings

from testcase import (
StorageTestCase,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
try:
import settings_real as settings
except ImportError:
import settings_fake as settings
import blob_settings_fake as settings

from testcase import (
StorageTestCase,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
try:
import settings_real as settings
except ImportError:
import settings_fake as settings
import blob_settings_fake as settings

from testcase import (
StorageTestCase,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
try:
import settings_real as settings
except ImportError:
import settings_fake as settings
import blob_settings_fake as settings

from testcase import (
StorageTestCase,
Expand Down
2 changes: 1 addition & 1 deletion sdk/storage/azure-storage-blob/tests/testcase.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
import unittest
import sys
import random
import settings_fake as fake_settings
import logging

try:
Expand All @@ -31,6 +30,7 @@

from azure.core.credentials import AccessToken

import blob_settings_fake as fake_settings
try:
import settings_real as settings
except ImportError:
Expand Down
41 changes: 41 additions & 0 deletions sdk/storage/azure-storage-file/HISTORY.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# Change Log azure-storage-file

## Version 12.0.0b1:

For release notes and more information please visit
https://aka.ms/azure-sdk-preview1-python

## Version 2.0.1:
- Updated dependency on azure-storage-common.

## Version 2.0.0:
- Support for 2018-11-09 REST version. Please see our REST API documentation and blogs for information about the related added features.
- Added an option to get share stats in bytes.
- Added support for listing and closing file handles.

## Version 1.4.0:

- azure-storage-nspkg is not installed anymore on Python 3 (PEP420-based namespace package)

## Version 1.3.1:

- Fixed design flaw where get_file_to_* methods buffer entire file when max_connections is set to 1.

## Version 1.3.0:

- Support for 2018-03-28 REST version. Please see our REST API documentation and blog for information about the related added features.

## Version 1.2.0rc1:

- Support for 2017-11-09 REST version. Please see our REST API documentation and blog for information about the related added features.

## Version 1.1.0:

- Support for 2017-07-29 REST version. Please see our REST API documentation and blogs for information about the related added features.
- Error message now contains the ErrorCode from the x-ms-error-code header value.

## Version 1.0.0:

- The package has switched from Apache 2.0 to the MIT license.
- Fixed bug where get_file_to_* cannot get a single byte when start_range and end_range are both equal to 0.
- Metadata keys are now case-preserving when fetched from the service. Previously they were made lower-case by the library.
21 changes: 21 additions & 0 deletions sdk/storage/azure-storage-file/LICENSE.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
The MIT License (MIT)

Copyright (c) 2017 Microsoft

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
4 changes: 4 additions & 0 deletions sdk/storage/azure-storage-file/MANIFEST.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
include *.md
include azure/__init__.py
include azure/storage/__init__.py
include LICENSE.txt
181 changes: 181 additions & 0 deletions sdk/storage/azure-storage-file/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,181 @@
# Azure Storage File client library for Python
Azure File offers fully managed file shares in the cloud that are accessible via the industry standard [Server Message Block (SMB) protocol](https://docs.microsoft.com/windows/desktop/FileIO/microsoft-smb-protocol-and-cifs-protocol-overview). Azure file shares can be mounted concurrently by cloud or on-premises deployments of Windows, Linux, and macOS. Additionally, Azure file shares can be cached on Windows Servers with Azure File Sync for fast access near where the data is being used.

Azure file shares can be used to:

* Replace or supplement on-premises file servers
* "Lift and shift" applications
* Simplify cloud development with shared application settings, diagnostic share, and Dev/Test/Debug tools

[Source code](https://github.com/Azure/azure-sdk-for-python/tree/master/sdk/storage/azure-storage-file/azure/storage/file) | [Package (PyPi)](https://pypi.org/project/azure-storage-file/) | [API reference documentation](https://docs.microsoft.com/rest/api/storageservices/file-service-rest-api) | [Product documentation](https://docs.microsoft.com/azure/storage/) | [Samples](https://github.com/Azure/azure-sdk-for-python/tree/master/sdk/storage/azure-storage-file/tests/samples)

## Getting started

### Install the package
Install the Azure Storage File client library for Python with [pip](https://pypi.org/project/pip/):

```bash
pip install azure-storage-file
```

**Prerequisites**: You must have an [Azure subscription](https://azure.microsoft.com/free/), and a
[Storage Account](https://docs.microsoft.com/azure/storage/common/storage-account-overview) to use this package.

To create a Storage Account, you can use the [Azure Portal](https://docs.microsoft.com/azure/storage/common/storage-quickstart-create-account?tabs=azure-portal),
[Azure PowerShell](https://docs.microsoft.com/azure/storage/common/storage-quickstart-create-account?tabs=azure-powershell) or [Azure CLI](https://docs.microsoft.com/azure/storage/common/storage-quickstart-create-account?tabs=azure-cli):

```bash
az storage account create -n MyStorageAccountName -g MyResourceGroupName
```

Requires Python 2.7, 3.5 or later to use this package.

### Authenticate the client

Interaction with Storage File starts with an instance of the FileServiceClient class. You need an existing storage account, its URL, and a credential to instantiate the client object.

#### Get credentials

To authenticate the client you have a few options:
1. Use a SAS token string
2. Use an account shared access key

Alternatively, you can authenticate with a storage connection string using the `from_connection_string` method. See example: [Client creation with a connection string](#client-creation-with-a-connection-string).

You can omit the credential if your account URL already has a SAS token.

#### Create client

Once you have your account URL and credentials ready, you can create the FileServiceClient:

```python
from azure.storage.file import FileServiceClient

service = FileServiceClient(account_url="https://<my-storage-account-name>.file.core.windows.net/", credential=credential)
```

## Key concepts

File storage includes the following concepts:
* The storage account
* A file storage share
* An optional hierarchy of directories
* A file in the share which may be up to 1 TiB in size

#### Clients

The Storage File SDK provides four different clients to interact with the File Service:
1. **FileServiceClient** - this client interacts with the File Service at the account level.
It provides operations to retrieve and configure the service properties
as well as list, create, and delete shares within the storage account.
For operations relating to a specific share, a client for that entity
can also be retrieved using the `get_share_client` function.
2. **ShareClient** - this client represents interaction with a specific
file share, although that share need not exist yet. It provides operations to create, delete, or
configure shares and includes operations to list and create files or directories.
For operations relating to a specific directory or file, those clients can also be retrieved using
the `get_directory_client` or `get_file_client` functions.
3. **DirectoryClient** - this client represents interaction with a specific
directory, although that directory need not exist yet. It provides operations to create, delete, and list
directories and subdirectories, as well as create and delete files in the directory. For operations
relating to a specific subdirectory or file, a client for that entity can also be retrieved using
the `get_subdirectory_client` and `get_file_client` functions.
4. **FileClient** - this client represents interaction with a specific file, although the file need not
exist yet. It provides operations to create, upload, copy, and download files as well as more advanced
operations.

For details on path naming restrictions, see [Naming and Referencing Shares, Directories, Files, and Metadata](https://docs.microsoft.com/rest/api/storageservices/naming-and-referencing-shares--directories--files--and-metadata).

## Examples

The following sections provide several code snippets covering some of the most common Storage File tasks, including:

* [Client creation with a connection string](#client-creation-with-a-connection-string)
* [Create a file share](#create-a-file-share)
* [Upload a file](#upload-a-file)


### Client creation with a connection string
Create the FileServiceClient using the connection string to your Azure Storage account.

```python
from azure.storage.file import FileServiceClient

service = FileServiceClient.from_connection_string("my_connection_string")
```

### Create a file share
Create a file share to store your files.

```python
from azure.storage.file import ShareClient

share = ShareClient.from_connection_string("my_connection_string", share="myshare")
share.create_share()
```

### Upload a file
Upload a file to the share

```python
from azure.storage.file import FileClient

file = FileClient.from_connection_string("my_connection_string", share="share", file_path="myfile")

with open("./SampleSource.txt", "rb") as source_file:
file.upload_file(source_file)
```

## Troubleshooting
Storage File clients raise exceptions defined in [Azure Core](https://github.com/Azure/azure-sdk-for-python/blob/master/sdk/core/azure-core/docs/exceptions.md).

All File service operations will throw a StorageErrorException on failure with helpful [error codes](https://docs.microsoft.com/rest/api/storageservices/file-service-error-codes).

## Next steps
### More sample code

Get started with our [File samples](https://github.com/Azure/azure-sdk-for-python/tree/master/sdk/storage/azure-storage-file/tests/samples).

Several Storage File Python SDK samples are available to you in the SDK's GitHub repository. These samples provide example code for additional scenarios commonly encountered while working with Storage File:

* [`test_file_samples_hello_world.py`](https://github.com/Azure/azure-sdk-for-python/tree/master/sdk/storage/azure-storage-file/tests/test_file_samples_hello_world.py) - Examples found in this article:
* Client creation
* Create a file share
* Upload a file

* [`test_file_samples_authentication.py`](https://github.com/Azure/azure-sdk-for-python/tree/master/sdk/storage/azure-storage-file/tests/test_file_samples_authentication.py) - Examples for authenticating and creating the client:
* From a connection string
* From a shared access key
* From a shared access signature token

* [`test_file_samples_service.py`](https://github.com/Azure/azure-sdk-for-python/tree/master/sdk/storage/azure-storage-file/tests/test_file_samples_service.py) - Examples for interacting with the file service:
* Get and set service properties
* Create, list, and delete shares
* Get a share client

* [`test_file_samples_share.py`](https://github.com/Azure/azure-sdk-for-python/tree/master/sdk/storage/azure-storage-file/tests/test_file_samples_share.py) - Examples for interacting with file shares:
* Create a share snapshot
* Set share quota and metadata
* List directories and files
* Get the directory or file client to interact with a specific entity

* [`test_file_samples_directory.py`](https://github.com/Azure/azure-sdk-for-python/tree/master/sdk/storage/azure-storage-file/tests/test_file_samples_directory.py) - Examples for interacting with directories:
* Create a directory and add files
* Create and delete subdirectories
* Get the subdirectory client

* [`test_file_samples_file.py`](https://github.com/Azure/azure-sdk-for-python/tree/master/sdk/storage/azure-storage-file/tests/test_file_samples_file.py) - Examples for interacting with files:
* Create, upload, download, and delete files
* Copy a file from a URL

### Additional documentation

For more extensive documentation on the Azure Storage File, see the [Azure Storage File documentation](https://docs.microsoft.com/azure/storage/) on docs.microsoft.com.


## Contributing
This project welcomes contributions and suggestions. Most contributions require you to agree to a Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us the rights to use your contribution. For details, visit https://cla.microsoft.com.

When you submit a pull request, a CLA-bot will automatically determine whether you need to provide a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the instructions provided by the bot. You will only need to do this once across all repos using our CLA.

This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.
1 change: 1 addition & 0 deletions sdk/storage/azure-storage-file/azure/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
__path__ = __import__('pkgutil').extend_path(__path__, __name__) # type: ignore
1 change: 1 addition & 0 deletions sdk/storage/azure-storage-file/azure/storage/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
__path__ = __import__('pkgutil').extend_path(__path__, __name__) # type: ignore
Loading

0 comments on commit 1f02e1b

Please sign in to comment.