Skip to content

Commit 1394b88

Browse files
zhaodongwang-msftMax WangCopilot
authored
Users/zhaodongwang/docstring update (#63)
* stash * sphinx doc string * update _ placement * cleanup * Update src/PowerPlatform/Dataverse/client.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * add class underscore * Update src/PowerPlatform/Dataverse/client.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * update indentation --------- Co-authored-by: Max Wang <zhaodongwang@microsoft.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
1 parent 8768b02 commit 1394b88

18 files changed

Lines changed: 179 additions & 179 deletions

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ from azure.identity import (
7676
ClientCertificateCredential,
7777
AzureCliCredential
7878
)
79-
from PowerPlatform.Dataverse import DataverseClient
79+
from PowerPlatform.Dataverse.client import DataverseClient
8080

8181
# Development options
8282
credential = InteractiveBrowserCredential() # Browser authentication
@@ -111,7 +111,7 @@ The SDK provides a simple, pythonic interface for Dataverse operations:
111111

112112
```python
113113
from azure.identity import InteractiveBrowserCredential
114-
from PowerPlatform.Dataverse import DataverseClient
114+
from PowerPlatform.Dataverse.client import DataverseClient
115115

116116
# Connect to Dataverse
117117
credential = InteractiveBrowserCredential()
@@ -285,7 +285,7 @@ For comprehensive information on Microsoft Dataverse and related technologies:
285285
The client raises structured exceptions for different error scenarios:
286286

287287
```python
288-
from PowerPlatform.Dataverse import DataverseClient
288+
from PowerPlatform.Dataverse.client import DataverseClient
289289
from PowerPlatform.Dataverse.core.errors import HttpError, ValidationError
290290

291291
try:

examples/advanced/file_upload.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
# Uncomment for local development from source
2525
# sys.path.append(str(Path(__file__).resolve().parents[2] / "src"))
2626

27-
from PowerPlatform.Dataverse import DataverseClient
27+
from PowerPlatform.Dataverse.client import DataverseClient
2828
from azure.identity import InteractiveBrowserCredential # type: ignore
2929
import requests
3030

examples/basic/functional_testing.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
from datetime import datetime
3131

3232
# Import SDK components (assumes installation is already validated)
33-
from PowerPlatform.Dataverse import DataverseClient
33+
from PowerPlatform.Dataverse.client import DataverseClient
3434
from PowerPlatform.Dataverse.core.errors import HttpError, MetadataError
3535
from azure.identity import InteractiveBrowserCredential
3636

examples/basic/installation_example.py

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -67,12 +67,13 @@ def validate_imports():
6767
print("-" * 50)
6868

6969
try:
70-
# Test main namespace import
71-
from PowerPlatform.Dataverse import DataverseClient, __version__
70+
# Test main namespace and client import
71+
from PowerPlatform.Dataverse import __version__
72+
from PowerPlatform.Dataverse.client import DataverseClient
7273

73-
print(f" ✅ Main namespace: PowerPlatform.Dataverse")
74+
print(f" ✅ Namespace: PowerPlatform.Dataverse")
7475
print(f" ✅ Package version: {__version__}")
75-
print(f" ✅ DataverseClient class: {DataverseClient}")
76+
print(f" ✅ Client class: PowerPlatform.Dataverse.client.DataverseClient")
7677

7778
# Test submodule imports
7879
from PowerPlatform.Dataverse.core.errors import HttpError, MetadataError
@@ -83,9 +84,9 @@ def validate_imports():
8384

8485
print(f" ✅ Core config: DataverseConfig")
8586

86-
from PowerPlatform.Dataverse.data.odata import ODataClient
87+
from PowerPlatform.Dataverse.data._odata import _ODataClient
8788

88-
print(f" ✅ Data layer: ODataClient")
89+
print(f" ✅ Data layer: _ODataClient")
8990

9091
# Test Azure Identity import
9192
from azure.identity import InteractiveBrowserCredential
@@ -176,7 +177,7 @@ def show_usage_examples():
176177
"""
177178
🔧 Basic Setup:
178179
```python
179-
from PowerPlatform.Dataverse import DataverseClient
180+
from PowerPlatform.Dataverse.client import DataverseClient
180181
from azure.identity import InteractiveBrowserCredential
181182
182183
# Set up authentication
@@ -271,7 +272,7 @@ def interactive_test():
271272
return
272273

273274
try:
274-
from PowerPlatform.Dataverse import DataverseClient
275+
from PowerPlatform.Dataverse.client import DataverseClient
275276
from azure.identity import InteractiveBrowserCredential
276277

277278
print(" 🔐 Setting up authentication...")

src/PowerPlatform/Dataverse/__init__.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,5 @@
22
# Licensed under the MIT license.
33

44
from .__version__ import __version__
5-
from .client import DataverseClient
65

7-
__all__ = ["DataverseClient", "__version__"]
6+
__all__ = ["__version__"]

src/PowerPlatform/Dataverse/client.py

Lines changed: 56 additions & 56 deletions
Large diffs are not rendered by default.
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,37 @@
11
# Copyright (c) Microsoft Corporation.
22
# Licensed under the MIT license.
33

4-
from __future__ import annotations
5-
64
"""
75
Authentication helpers for Dataverse.
86
9-
This module provides :class:`~PowerPlatform.Dataverse.core.auth.AuthManager`, a thin wrapper over any Azure Identity
10-
``TokenCredential`` for acquiring OAuth2 access tokens, and :class:`~PowerPlatform.Dataverse.core.auth.TokenPair` for
7+
This module provides :class:`~PowerPlatform.Dataverse.core._auth._AuthManager`, a thin wrapper over any Azure Identity
8+
``TokenCredential`` for acquiring OAuth2 access tokens, and :class:`~PowerPlatform.Dataverse.core._auth._TokenPair` for
119
storing the acquired token alongside its scope.
1210
"""
1311

12+
from __future__ import annotations
13+
1414
from dataclasses import dataclass
1515

1616
from azure.core.credentials import TokenCredential
1717

1818

1919
@dataclass
20-
class TokenPair:
20+
class _TokenPair:
2121
"""
2222
Container for an OAuth2 access token and its associated resource scope.
2323
2424
:param resource: The OAuth2 scope/resource for which the token was acquired.
25-
:type resource: ``str``
25+
:type resource: :class:`str`
2626
:param access_token: The access token string.
27-
:type access_token: ``str``
27+
:type access_token: :class:`str`
2828
"""
2929

3030
resource: str
3131
access_token: str
3232

3333

34-
class AuthManager:
34+
class _AuthManager:
3535
"""
3636
Azure Identity-based authentication manager for Dataverse.
3737
@@ -45,15 +45,15 @@ def __init__(self, credential: TokenCredential) -> None:
4545
raise TypeError("credential must implement azure.core.credentials.TokenCredential.")
4646
self.credential: TokenCredential = credential
4747

48-
def acquire_token(self, scope: str) -> TokenPair:
48+
def _acquire_token(self, scope: str) -> _TokenPair:
4949
"""
5050
Acquire an access token for the specified OAuth2 scope.
5151
5252
:param scope: OAuth2 scope string, typically ``"https://<org>.crm.dynamics.com/.default"``.
53-
:type scope: ``str``
53+
:type scope: :class:`str`
5454
:return: Token pair containing the scope and access token.
55-
:rtype: ~PowerPlatform.Dataverse.core.auth.TokenPair
55+
:rtype: ~PowerPlatform.Dataverse.core._auth._TokenPair
5656
:raises ~azure.core.exceptions.ClientAuthenticationError: If token acquisition fails.
5757
"""
5858
token = self.credential.get_token(scope)
59-
return TokenPair(resource=scope, access_token=token.token)
59+
return _TokenPair(resource=scope, access_token=token.token)

src/PowerPlatform/Dataverse/core/error_codes.py renamed to src/PowerPlatform/Dataverse/core/_error_codes.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -77,28 +77,28 @@
7777
TRANSIENT_STATUS = {429, 502, 503, 504}
7878

7979

80-
def http_subcode(status: int) -> str:
80+
def _http_subcode(status: int) -> str:
8181
"""
8282
Convert HTTP status code to error subcode string.
8383
8484
:param status: HTTP status code (e.g., 400, 404, 500).
85-
:type status: ``int``
85+
:type status: :class:`int`
8686
:return: Error subcode string (e.g., "http_400", "http_404").
87-
:rtype: ``str``
87+
:rtype: :class:`str`
8888
"""
8989
return HTTP_STATUS_TO_SUBCODE.get(status, f"http_{status}")
9090

9191

92-
def is_transient_status(status: int) -> bool:
92+
def _is_transient_status(status: int) -> bool:
9393
"""
9494
Check if an HTTP status code indicates a transient error that may succeed on retry.
9595
9696
Transient status codes include: 429 (Too Many Requests), 502 (Bad Gateway),
9797
503 (Service Unavailable), and 504 (Gateway Timeout).
9898
9999
:param status: HTTP status code to check.
100-
:type status: ``int``
100+
:type status: :class:`int`
101101
:return: True if the status code is considered transient.
102-
:rtype: ``bool``
102+
:rtype: :class:`bool`
103103
"""
104104
return status in TRANSIENT_STATUS
Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
"""
55
HTTP client with automatic retry logic and timeout handling.
66
7-
This module provides :class:`~PowerPlatform.Dataverse.core.http.HttpClient`, a wrapper
7+
This module provides :class:`~PowerPlatform.Dataverse.core._http._HttpClient`, a wrapper
88
around the requests library that adds configurable retry behavior for transient
99
network errors and intelligent timeout management based on HTTP method types.
1010
"""
@@ -17,19 +17,19 @@
1717
import requests
1818

1919

20-
class HttpClient:
20+
class _HttpClient:
2121
"""
2222
HTTP client with configurable retry logic and timeout handling.
2323
2424
Provides automatic retry behavior for transient failures and default timeout
2525
management for different HTTP methods.
2626
2727
:param retries: Maximum number of retry attempts for transient errors. Default is 5.
28-
:type retries: ``int`` | ``None``
28+
:type retries: :class:`int` | None
2929
:param backoff: Base delay in seconds between retry attempts. Default is 0.5.
30-
:type backoff: ``float`` | ``None``
30+
:type backoff: :class:`float` | None
3131
:param timeout: Default request timeout in seconds. If None, uses per-method defaults.
32-
:type timeout: ``float`` | ``None``
32+
:type timeout: :class:`float` | None
3333
"""
3434

3535
def __init__(
@@ -42,20 +42,20 @@ def __init__(
4242
self.base_delay = backoff if backoff is not None else 0.5
4343
self.default_timeout: Optional[float] = timeout
4444

45-
def request(self, method: str, url: str, **kwargs: Any) -> requests.Response:
45+
def _request(self, method: str, url: str, **kwargs: Any) -> requests.Response:
4646
"""
4747
Execute an HTTP request with automatic retry logic and timeout management.
4848
4949
Applies default timeouts based on HTTP method (120s for POST/DELETE, 10s for others)
5050
and retries on network errors with exponential backoff.
5151
5252
:param method: HTTP method (GET, POST, PUT, DELETE, etc.).
53-
:type method: ``str``
53+
:type method: :class:`str`
5454
:param url: Target URL for the request.
55-
:type url: ``str``
55+
:type url: :class:`str`
5656
:param kwargs: Additional arguments passed to ``requests.request()``, including headers, data, etc.
5757
:return: HTTP response object.
58-
:rtype: ``requests.Response``
58+
:rtype: :class:`requests.Response`
5959
:raises requests.exceptions.RequestException: If all retry attempts fail.
6060
"""
6161
# If no timeout is provided, use the user-specified default timeout if set;

src/PowerPlatform/Dataverse/core/config.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
# Copyright (c) Microsoft Corporation.
22
# Licensed under the MIT license.
33

4-
from __future__ import annotations
5-
64
"""
75
Dataverse client configuration.
86
@@ -11,6 +9,8 @@
119
convenience constructor :meth:`~PowerPlatform.Dataverse.core.config.DataverseConfig.from_env`.
1210
"""
1311

12+
from __future__ import annotations
13+
1414
from dataclasses import dataclass
1515
from typing import Optional
1616

@@ -21,13 +21,13 @@ class DataverseConfig:
2121
Configuration settings for Dataverse client operations.
2222
2323
:param language_code: LCID (Locale ID) for localized labels and messages. Default is 1033 (English - United States).
24-
:type language_code: ``int``
24+
:type language_code: :class:`int`
2525
:param http_retries: Optional maximum number of retry attempts for transient HTTP errors. Reserved for future use.
26-
:type http_retries: ``int`` | ``None``
26+
:type http_retries: :class:`int` or None
2727
:param http_backoff: Optional backoff multiplier (in seconds) between retry attempts. Reserved for future use.
28-
:type http_backoff: ``float`` | ``None``
28+
:type http_backoff: :class:`float` or None
2929
:param http_timeout: Optional request timeout in seconds. Reserved for future use.
30-
:type http_timeout: ``float`` | ``None``
30+
:type http_timeout: :class:`float` or None
3131
"""
3232

3333
language_code: int = 1033

0 commit comments

Comments
 (0)