Skip to content

Commit 1d51087

Browse files
authored
[core] add is_sdk_model check and tests (Azure#41445)
1 parent ac16ade commit 1d51087

File tree

3 files changed

+55
-1
lines changed

3 files changed

+55
-1
lines changed

sdk/core/azure-core/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
### Features Added
66

77
- Added a `start_time` keyword argument to the `start_span` and `start_as_current_span` methods in the `OpenTelemetryTracer` class. This allows users to specify a custom start time for created spans. #41106
8+
- Added `is_generated_model` method to `azure.core.serialization`. Returns whether a given input is a model from one of our generated sdks. #41445
89

910
### Breaking Changes
1011

sdk/core/azure-core/azure/core/serialization.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,3 +129,14 @@ def default(self, o: Any) -> Any:
129129
except AttributeError:
130130
pass
131131
return super(AzureJSONEncoder, self).default(o)
132+
133+
134+
def is_generated_model(obj: Any) -> bool:
135+
"""Check if the object is a generated SDK model.
136+
137+
:param obj: The object to check.
138+
:type obj: any
139+
:return: True if the object is a generated SDK model, False otherwise.
140+
:rtype: bool
141+
"""
142+
return bool(getattr(obj, "_is_model", False) or hasattr(obj, "_attribute_map"))

sdk/core/azure-core/tests/test_serialization.py

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import json
99
import sys
1010

11-
from azure.core.serialization import AzureJSONEncoder, NULL
11+
from azure.core.serialization import AzureJSONEncoder, NULL, is_generated_model
1212
import pytest
1313
from modeltest._utils.model_base import Model as HybridModel, rest_field
1414
from modeltest import models
@@ -512,3 +512,45 @@ def test_readonly():
512512
assert model.id == 1
513513
assert model.as_dict() == {"id": 1}
514514
assert model.as_dict(exclude_readonly=True) == {}
515+
516+
517+
def test_is_generated_model_with_hybrid_model():
518+
assert is_generated_model(HybridModel())
519+
assert is_generated_model(models.FlattenModel({"name": "wall-e", "properties": {"description": "a dog", "age": 2}}))
520+
assert is_generated_model(models.ClientNamedPropertyModel(prop_client_name="wall-e"))
521+
assert is_generated_model(models.ReadonlyModel())
522+
523+
524+
def test_is_generated_model_with_msrest_model():
525+
# Instead of importing msrest, we're just going to do a basic rendering of the msrest models
526+
class MsrestModel(object):
527+
_subtype_map = {}
528+
_attribute_map = {}
529+
_validation = {}
530+
531+
def __init__(self, *args, **kwargs):
532+
self.additional_properties = {}
533+
534+
assert is_generated_model(MsrestModel())
535+
536+
class InstantiatedMsrestModel(MsrestModel):
537+
def __init__(self, *args, **kwargs):
538+
super().__init__(*args, **kwargs)
539+
self.attr = "value"
540+
541+
assert is_generated_model(InstantiatedMsrestModel())
542+
543+
544+
def test_is_generated_model_with_non_models():
545+
assert not is_generated_model({})
546+
assert not is_generated_model([])
547+
assert not is_generated_model("string")
548+
assert not is_generated_model(42)
549+
assert not is_generated_model(None)
550+
assert not is_generated_model(object)
551+
552+
class Model:
553+
def __init__(self):
554+
self.attr = "value"
555+
556+
assert not is_generated_model(Model())

0 commit comments

Comments
 (0)