Skip to content

Commit 9e15426

Browse files
rsareddy0329Roja Reddy Sareddy
and
Roja Reddy Sareddy
authored
fix: Changes to address the field name error: json shadows a BaseModel attribute (#270)
* fix: Changes to address the field name error: json shadows a BaseModel attribute * fix: Changes to address the field name error: json shadows a BaseModel attribute * fix: rev-2 - Changes to address the field name error: json shadows a BaseModel attribute * fix: rev-2 - Changes to address the field name error: json shadows a BaseModel attribute --------- Co-authored-by: Roja Reddy Sareddy <[email protected]>
1 parent a083164 commit 9e15426

File tree

3 files changed

+44
-9
lines changed

3 files changed

+44
-9
lines changed

src/sagemaker_core/tools/constants.py

+2
Original file line numberDiff line numberDiff line change
@@ -97,3 +97,5 @@
9797
CONFIG_SCHEMA_FILE_NAME = "config_schema.py"
9898

9999
API_COVERAGE_JSON_FILE_PATH = os.getcwd() + "/src/sagemaker_core/tools/api_coverage.json"
100+
101+
SHAPES_WITH_JSON_FIELD_ALIAS = ["MonitoringDatasetFormat"] # Shapes with field name with "json"

src/sagemaker_core/tools/shapes_codegen.py

+9-2
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
LICENCES_STRING,
2323
GENERATED_CLASSES_LOCATION,
2424
SHAPES_CODEGEN_FILE_NAME,
25+
SHAPES_WITH_JSON_FIELD_ALIAS,
2526
)
2627
from sagemaker_core.tools.shapes_extractor import ShapesExtractor
2728
from sagemaker_core.main.utils import (
@@ -180,7 +181,13 @@ def _generate_doc_string_for_shape(self, shape):
180181

181182
if "members" in shape_dict:
182183
for member, member_attributes in shape_dict["members"].items():
183-
docstring += f"\n{convert_to_snake_case(member)}"
184+
# Add alias if field name is json, to address the Bug: https://github.com/aws/sagemaker-python-sdk/issues/4944
185+
if shape in SHAPES_WITH_JSON_FIELD_ALIAS and member == "Json":
186+
updated_member = "JsonFormat"
187+
docstring += f"\n{convert_to_snake_case(updated_member)}"
188+
else:
189+
docstring += f"\n{convert_to_snake_case(member)}"
190+
184191
if "documentation" in member_attributes:
185192
docstring += f": {member_attributes['documentation']}"
186193

@@ -204,7 +211,7 @@ def generate_imports(self):
204211
"""
205212
imports = "import datetime\n"
206213
imports += "\n"
207-
imports += "from pydantic import BaseModel, ConfigDict\n"
214+
imports += "from pydantic import BaseModel, ConfigDict, Field\n"
208215
imports += "from typing import List, Dict, Optional, Any, Union\n"
209216
imports += "from sagemaker_core.main.utils import Unassigned"
210217
imports += "\n"

src/sagemaker_core/tools/shapes_extractor.py

+33-7
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,11 @@
1616
from functools import lru_cache
1717
from typing import Optional, Any
1818

19-
from sagemaker_core.tools.constants import BASIC_JSON_TYPES_TO_PYTHON_TYPES, SHAPE_DAG_FILE_PATH
19+
from sagemaker_core.tools.constants import (
20+
BASIC_JSON_TYPES_TO_PYTHON_TYPES,
21+
SHAPE_DAG_FILE_PATH,
22+
SHAPES_WITH_JSON_FIELD_ALIAS,
23+
)
2024
from sagemaker_core.main.utils import (
2125
reformat_file_with_black,
2226
convert_to_snake_case,
@@ -99,6 +103,11 @@ def get_shapes_dag(self):
99103
_dag[shape] = {"type": "structure", "members": []}
100104
for member, member_attrs in shape_data["members"].items():
101105
shape_node_member = {"name": member, "shape": member_attrs["shape"]}
106+
# Add alias if field name is json, to address the Bug: https://github.com/aws/sagemaker-python-sdk/issues/4944
107+
if shape in SHAPES_WITH_JSON_FIELD_ALIAS and member == "Json":
108+
shape_node_member["name"] = "JsonFormat"
109+
shape_node_member["alias"] = "json"
110+
102111
member_shape_dict = _all_shapes[member_attrs["shape"]]
103112
shape_node_member["type"] = member_shape_dict["type"]
104113
_dag[shape]["members"].append(shape_node_member)
@@ -218,6 +227,8 @@ def generate_shape_members(self, shape, required_override=()):
218227
# bring the required members in front
219228
ordered_members = {key: members[key] for key in required_args if key in members}
220229
ordered_members.update(members)
230+
field_aliases = {}
231+
221232
for member_name, member_attrs in ordered_members.items():
222233
member_shape_name = member_attrs["shape"]
223234
if self.combined_shapes[member_shape_name]:
@@ -234,13 +245,28 @@ def generate_shape_members(self, shape, required_override=()):
234245
member_type = BASIC_JSON_TYPES_TO_PYTHON_TYPES[member_shape_type]
235246
else:
236247
raise Exception("The Shape definition mush exist. The Json Data might be corrupt")
237-
member_name_snake_case = convert_to_snake_case(member_name)
238-
if member_name in required_args:
239-
init_data_body[f"{member_name_snake_case}"] = f"{member_type}"
240-
else:
241-
init_data_body[f"{member_name_snake_case}"] = (
242-
f"Optional[{member_type}] = Unassigned()"
248+
249+
is_required = member_name in required_args
250+
# Add alias if field name is json, to address the Bug: https://github.com/aws/sagemaker-python-sdk/issues/4944
251+
if shape in SHAPES_WITH_JSON_FIELD_ALIAS and member_name == "Json":
252+
updated_member_name_snake_case = "json_format"
253+
field_aliases[updated_member_name_snake_case] = "json"
254+
init_data_body[f"{updated_member_name_snake_case}"] = (
255+
(
256+
f"{member_type} = Field(alias='{field_aliases[updated_member_name_snake_case]}')"
257+
)
258+
if is_required
259+
else f"Optional[{member_type}] = Field(default=Unassigned(), alias='json')"
243260
)
261+
else:
262+
member_name_snake_case = convert_to_snake_case(member_name)
263+
if is_required:
264+
init_data_body[f"{member_name_snake_case}"] = f"{member_type}"
265+
else:
266+
init_data_body[f"{member_name_snake_case}"] = (
267+
f"Optional[{member_type}] = Unassigned()"
268+
)
269+
244270
return init_data_body
245271

246272
@lru_cache

0 commit comments

Comments
 (0)