Skip to content

Commit

Permalink
Merge branch 'master' of https://github.com/Azure/azure-sdk-for-python
Browse files Browse the repository at this point in the history
…into agrifood_nspkg

* 'master' of https://github.com/Azure/azure-sdk-for-python: (31 commits)
  [purview] add catalog client (Azure#17788)
  Add spellcheck for modified files (Azure#18496)
  [Container Registry] Update API for Beta 2 (Azure#18392)
  First version of Confidential Ledger Python SDK (Azure#17951)
  [llc] add quickstart (Azure#18537)
  [Storage][Fix]Copy source is redirecting (Azure#18577)
  [Tables] pre-release script (Azure#18505)
  Update changelogs (Azure#18575)
  [formrecognizer] Adding to_dict() on custom models (Azure#18402)
  Raise CredentialUnavailableError when CLI subprocess times out (Azure#18509)
  Extend Check Enforcer timeout (Azure#18526)
  Core raw streaming (Azure#17920)
  hide secrets in mgmt sdk (Azure#18535)
  add filter samples for list methods (Azure#18480)
  Revert changes to SetDevVersion. (Azure#18555)
  add support for filtering/paging/sorting options for "list_**" methods (Azure#18302)
  [Tables] Misc client updates (Azure#18462)
  [EventHub&ServiceBus] Prepare for release (Azure#18527)
  [Communication]: Updated communication connection strings to be consistent across packages and languages (Azure#18519)
  [AppConfig] Fixing samples (Azure#18542)
  ...
  • Loading branch information
iscai-msft committed May 7, 2021
2 parents 8cf5c76 + e0406a6 commit ee40824
Show file tree
Hide file tree
Showing 470 changed files with 243,854 additions and 12,268 deletions.
13 changes: 13 additions & 0 deletions .vscode/cspell.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
{
"version": "0.1",
"language": "en",
"languageId": "python",
"dictionaries": [
"powershell"
],
"ignorePaths": [
".vscode/cspell.json"
],
"words": ["azsdk", "conda", "tenvparallel"],
"allowCompoundWords": false
}
303 changes: 303 additions & 0 deletions doc/request_builders.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,303 @@
# Using Request Builders with Your Service Client

In this doc, we will be showing how to use our ***request builders*** to build ***http requests*** - or create raw ***http requests*** yourselves - and
send these requests directly to the service using the ***send_request*** method.

Here's how to get started:

```python
>>> from azure.identity import DefaultAzureCredential
>>> from azure.example import ExampleClient
>>> from azure.example.rest import build_example_request
>>> client = ExampleClient(endpoint='https://www.example.org/', credential=DefaultAzureCredential())
>>> request = build_example_request()
>>> request
<HttpRequest [GET], url: 'https://www.example.org'>
>>> response = client.send_request(request)
>>> response
<HttpResponse: 200 OK, Content-Type: text/plain>
>>> response.raise_for_status()
>>> response.text
'Happy to see you!'
```

## Code Snippets

**Code snippets for how to use our request builders with our clients**:

1. [Sync client](#sync-client)
2. [Async client](#async-client)

## Steps To Make a Call

1. [Initialize your client](#1-initialize-your-client "Initialize Your Client")
2. [Create a request](#2-create-a-request "Create a Request")
3. [Send the request](#3-send-the-request "Send the Request")
4. [Handle the response](#4-handle-the-response "Handle the Response")

We will go into each step in the following sections

## 1. Initialize Your Client

First you import your client from the namespace of your package. For example, let's say your namespace is `azure.example` and your client's name
is `ExampleClient`. Your import would look like

```python
from azure.example import ExampleClient
```

Most clients require authenticating through their `credential` parameter. Depending on what authentication support your library is using, you can either [authenticate with aad](#authenticating-with-aad) or [authenticate with an `AzureKeyCredential`](#authenticating-with-azurekeycredential).

Additionally, most of our clients accept an `endpoint` parameter at initialization, usually a link to your own resource.

### Authenticating with AAD

If your client supports authenticating with an [Azure Active Directory (AAD) token credential][aad_authentication], we provide a convenient library for AAD authentication called [`azure-identity`][azure_identity_docs] that can be installed additionally with:

```bash
pip install azure-identity
```

Once [`azure-identity`][azure_identity_pip] is installed, the simplest way to authenticate is to use the [`DefaultAzureCredential`][default_azure_credential] class.

The following code snippet shows you how to authenticate with a [`DefaultAzureCredential`][default_azure_credential].

```python
from azure.identity import DefaultAzureCredential
from azure.example import ExampleClient

client = ExampleClient(
endpoint="https://www.example.org/",
credential=DefaultAzureCredential()
)
```

### Authenticating with [`AzureKeyCredential`][azure_key_credential]

Some libraries support authenticating with an [`AzureKeyCredential`][azure_key_credential]. The following code snippet shows you how to authenticate with an
[`AzureKeyCredential`][azure_key_credential]

```python
from azure.core.credentials import AzureKeyCredential
from azure.example import ExampleClient

credential = "myCredential"
client = ExampleClient(
endpoint="https://www.example.org/",
credential=AzureKeyCredential(credential)
)
```

## 2. Create a Request

Next, you need to create the request you want to be sent to the service.

We offer [request builders](#use-our-request-builders) to make creating your `HttpRequest`s easier.

For more advanced users, you can also [create your `HttpRequest` fully by yourself](#create-your-own-httprequest)

### Use our Request Builders

Our request builders:

- Keep track of the URL and method of the call, so you don't have to
- Let you know what parameters the service needs
- Take care of formatting your parameters
- Will be grouped into submodules if there's a natural grouping to them.

These request builders are located in the `rest` module of our libraries. If there's
a natural grouping to request builders, these submodule groups will live inside the `rest` module.

Now, let's make a request with a `json` body.

```python
from azure.example.rest import build_analyze_text_request

request = build_analyze_text_request(
json={"document": "Hello world!"},
language="en",
)
```

If the `rest` module has grouped submodules, we recommend importing the whole submodule like this to
avoid name conflicts:

```python
from azure.example.rest import languages

request = languages.build_detect_request(
json={"document": "世界你好!"}
)
```

### Create Your Own [`HttpRequest`][azure_core_http_request]

For more advanced scenarios, you can also create your own [`HttpRequest`][azure_core_http_request].

Let's make the same request as we do in our [previous example](#use-our-request-builders)

```python
from azure.example.core.rest import HttpRequest

# this URL is relative to the endpoint we passed our client
request = HttpRequest("POST", "/helloWorld",
json={"document": "Hello world!"},
params={"language": "en"}
)
```

## 3. Send the Request

Now, we pass this request to your client's `send_request` method. This actually makes the network call.

```python
from azure.example import ExampleClient

response = client.send_request(request) # makes the network call
```

## 4. Handle the Response

Our `send_request` call returns an [`HttpResponse`][azure_core_http_response].

### Error handling

The response you get back from `send_request` will not automatically raise if your response is an error.
If you wish to raise an error if your response is bad, call [`.raise_for_status()`][azure_core_raise_for_status] on your returned
response.

```python
try:
response.raise_for_status() # raises an error if your response is not good
except HttpResponseError as e:
print(str(e))
```

### JSON response

If the response you get back should be a `json` object, you can call `.json()` on your response
to get it `json`-deserialized.

Putting this all together, see our code snippets for how you can deal with your response object

```python

response = client.send_request(request)
try:
response.raise_for_status() # raises an error if your response is not good
json_response = response.json() # get your response as a json object
# Now play with your JSON response!

except HttpResponseError as e:
print(str(e))
```

## Examples

### Sync Client

```python
from azure.identity import DefaultAzureCredential
from azure.example import ExampleClient
from azure.example.rest import build_analyze_text_request
from azure.core.exceptions import HttpResponseError

client = ExampleClient(
endpoint="https://example.org",
credential=DefaultAzureCredential()
)

request = build_analyze_text_request(
json={"document": "Hello world!"},
language="en",
)

response = client.send_request(request)

try:
response.raise_for_status()
json_response = response.json()
# Play with your response!
except HttpResponseError:
print(str(e))
```

### Async Client

```python
from azure.identity.aio import DefaultAzureCredential
from azure.example.aio import ExampleClient
from azure.example.rest import build_analyze_text_request
from azure.core.exceptions import HttpResponseError

request = build_analyze_text_request(
json={"document": "Hello world!"},
language="en",
)

with DefaultAzureCredential() as credential:
with ExampleClient(endpoint="https://example.org", credential=credential) as client:
response = await client.send_request(request)

try:
response.raise_for_status()
await response.load_body()
json_response = response.json()
# Play with your response!
except HttpResponseError:
print(str(e))
```

## Troubleshooting

### Errors

All errors thrown by `.raise_for_error()` are [exceptions defined in `azure-core`][azure_core_exceptions].

### Logging

Our clients also have logging support. They use the standard
[logging][python_logging] library for logging.
Basic information about HTTP sessions (URLs, headers, etc.) is logged at INFO
level.

Detailed DEBUG level logging, including request/response bodies and un-redacted
headers, can be enabled on a client with the `logging_enable` keyword argument.

```python
from azure.identity import DefaultAzureCredential
from azure.example import ExampleClient

client = ExampleClient(
endpoint="https://example.org",
credential=DefaultAzureCredential(),
logging_enable=True
)
```

### File an Issue

You can file issues [here][issues] in our repo.

<!-- LINKS -->

[azure_core_docs]: https://docs.microsoft.com/python/api/overview/azure/core-readme?view=azure-python
[azure_identity_docs]: https://docs.microsoft.com/python/api/overview/azure/identity-readme?view=azure-python
[http_response]: https://docs.microsoft.com/python/api/azure-core/azure.core.pipeline.transport.httpresponse?view=azure-python
[azure_identity_pip]: https://pypi.org/project/azure-identity/
[aad_authentication]: https://docs.microsoft.com/azure/cognitive-services/authentication?tabs=powershell#authenticate-with-an-authentication-token
[identity_credentials]: https://github.com/Azure/azure-sdk-for-python/tree/master/sdk/identity/azure-identity#credentials
[default_azure_credential]: https://docs.microsoft.com/python/api/azure-identity/azure.identity.defaultazurecredential?view=azure-python
[azure_key_credential]: https://docs.microsoft.com/python/api/azure-core/azure.core.credentials.azurekeycredential?view=azure-python
[bearer_token_credential_policy]: https://docs.microsoft.com/python/api/azure-core/azure.core.pipeline.policies.bearertokencredentialpolicy?view=azure-python
[azure_key_credential_policy]: https://docs.microsoft.com/python/api/azure-core/azure.core.pipeline.policies.azurekeycredentialpolicy?view=azure-python
[azure_core_exceptions]: https://docs.microsoft.com/python/api/azure-core/azure.core.exceptions?view=azure-python
[azure_core_http_request]: https://docsupport.blob.core.windows.net/$web/azure-core/azure.core.html#azure.core.protocol.HttpRequest
[azure_core_http_response]: https://docsupport.blob.core.windows.net/$web/azure-core/azure.core.html#azure.core.protocol.HttpResponse
[azure_core_async_http_response]: https://docsupport.blob.core.windows.net/$web/azure-core/azure.core.html#azure.core.protocol.AsyncHttpResponse
[azure_core_raise_for_status]: https://docsupport.blob.core.windows.net/$web/azure-core/azure.core.html#azure.core.protocol.HttpResponse.raise_for_status
[python_logging]: https://docs.python.org/3.5/library/logging.html
[code_of_conduct]: https://opensource.microsoft.com/codeofconduct/
[coc_faq]: https://opensource.microsoft.com/codeofconduct/faq/
[coc_contact]: mailto:opencode@microsoft.com
[issues]: https://github.com/Azure/azure-sdk-for-python/issues
4 changes: 2 additions & 2 deletions eng/CHECKENFORCER
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
format: v0.1-alpha
minimumCheckRuns: 1
timeout: 5
timeout: 10
message: >
This pull request is protected by [Check Enforcer](https://aka.ms/azsdk/check-enforcer).

Expand Down Expand Up @@ -55,4 +55,4 @@ message: >

```
/azp run python - [service] - ci
```
```
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,9 @@ steps:
condition: succeeded()
- pwsh: |
$setDailyDevBuild = "false"
if (('$(Build.Reason)' -in 'Schedule', 'IndividualCI') -and ('$(System.TeamProject)' -eq 'internal')) {
if (('$(Build.Reason)' -eq 'Schedule') -and ('$(System.TeamProject)' -eq 'internal')) {
$setDailyDevBuild = "true"
}
echo "##vso[task.setvariable variable=SetDevVersion]$setDailyDevBuild"
displayName: "Setup Versioning Properties"
condition: eq(variables['SetDevVersion'], '')
- pwsh: |
echo "##vso[task.setvariable variable=SetDevVersion;isOutput=true]$(SetDevVersion)"
name: VersioningProperties
displayName: "Export Versioning Properties"
2 changes: 2 additions & 0 deletions eng/pipelines/templates/jobs/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,8 @@ jobs:
vmImage: MMSUbuntu18.04

steps:
- template: /eng/common/pipelines/templates/steps/check-spelling.yml

- template: /eng/common/pipelines/templates/steps/verify-links.yml
parameters:
${{ if eq(variables['Build.Reason'], 'PullRequest') }}:
Expand Down
1 change: 0 additions & 1 deletion scripts/auto_release/mgmt_settings_real_.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@
ACTIVE_DIRECTORY_TENANT_ID = '00000000-0000-0000-0000-000000000000'
IS_SERVER_SIDE_FILE_ENCRYPTION_ENABLED = True
ENABLE_LOGGING = True
AZURE_STORAGE_CONNECTION_STRING = 'DefaultEndpointsProtocol=https;AccountName=storagename;AccountKey=NzhL3hKZbJBuJ2484dPTR+xF30kYaWSSCbs2BzLgVVI1woqeST/1IgqaLm6QAOTxtGvxctSNbIR/1hW8yH+bJg==;EndpointSuffix=core.windows.net'

# Read for details of this file:
# https://github.com/Azure/azure-sdk-for-python/wiki/Contributing-to-the-tests
Expand Down
8 changes: 8 additions & 0 deletions sdk/appconfiguration/azure-appconfiguration/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
# Release History

## 1.2.0b2 (2021-05-11)

### Features
- Adds context manager functionality to the sync and async `AzureAppConfigurationClient`s.

### Fixes
- Fixes a deserialization bug for `FeatureFlagConfigurationSetting` and `SecretReferenceConfigurationSetting`.

## 1.2.0b1 (2021-04-06)

### Features
Expand Down
Loading

0 comments on commit ee40824

Please sign in to comment.