openapi-generators / openapi-generators/openapi-python-client
Client generation error when property names differ only by underscore prefix / suffix
還沒有人認領這個 Issue。
- 主要語言
- Python
- 星號
- 2k
- 分支
- 293
- 平均合併
- 34 分鐘
- 30 天內合併 PR
- 1
描述
Originally predicted in https://github.com/openapi-generators/openapi-python-client/issues/383#issuecomment-830839559
Since re.findall(rf"[^{DELIMITERS}]+", value) trims prefix and suffix _ characters while generating python property identifiers, 2+ schema properties on a single model that differ only by such underscores causes CLI generate and update commands to fail.
Given it would be problematic to carry through those untrimmed identifiers due to the semantic meaning of prefix and suffix _ on identifiers in python, it makes sense to have a fallback value to use like a title property or a configurable prefix.
Resulting error:
$ openapi-python-client generate --path schema-underscore-collision.yaml --fail-on-warning
Generating schema-underscore-collision-client
Error(s) encountered while generating, client was not created
black failed
reformatted schema_underscore_collision_client/api/__init__.py
reformatted schema_underscore_collision_client/__init__.py
reformatted schema_underscore_collision_client/types.py
error: cannot format schema_underscore_collision_client/models/get_response_200.py: cannot use --safe with this file; failed to parse source file AST: keyword argument repeated (<unknown>, line 55)
This could be caused by running Black with an older Python version that does not support new syntax used in your source file.
reformatted schema_underscore_collision_client/client.py
reformatted schema_underscore_collision_client/api/default/get.py
Oh no! 💥 💔 💥
5 files reformatted, 2 files left unchanged, 1 file failed to reformat.
Using an example schema-underscore-collision.yaml:
openapi: 3.0.2
info:
title: schema-underscore-collision
version: 1.0.0
paths:
/:
get:
description:
responses:
'200':
description: test
content:
application/json:
schema:
type: object
properties:
_a: {}
a: {}
a_: {}
The problematic schema_underscore_collision_client/models/get_response_200.py file, reported error is in the from_dict method but to_dict also suffers from the ambiguity:
from typing import Any, BinaryIO, Dict, List, Optional, TextIO, Tuple, Type, TypeVar, Union
import attr
from ..types import UNSET, Unset
T = TypeVar("T", bound="GetResponse200")
@attr.s(auto_attribs=True)
class GetResponse200:
"""
Attributes:
a (Union[Unset, Any]):
a (Union[Unset, Any]):
a (Union[Unset, Any]):
"""
a: Union[Unset, Any] = UNSET
a: Union[Unset, Any] = UNSET
a: Union[Unset, Any] = UNSET
additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict)
def to_dict(self) -> Dict[str, Any]:
a = self.a
a = self.a
a = self.a
field_dict: Dict[str, Any] = {}
field_dict.update(self.additional_properties)
field_dict.update({
})
if a is not UNSET:
field_dict["_a"] = a
if a is not UNSET:
field_dict["a"] = a
if a is not UNSET:
field_dict["a_"] = a
return field_dict
@classmethod
def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
d = src_dict.copy()
a = d.pop("_a", UNSET)
a = d.pop("a", UNSET)
a = d.pop("a_", UNSET)
get_response_200 = cls(
a=a,
a=a,
a=a,
)
get_response_200.additional_properties = d
return get_response_200
@property
def additional_keys(self) -> List[str]:
return list(self.additional_properties.keys())
def __getitem__(self, key: str) -> Any:
return self.additional_properties[key]
def __setitem__(self, key: str, value: Any) -> None:
self.additional_properties[key] = value
def __delitem__(self, key: str) -> None:
del self.additional_properties[key]
def __contains__(self, key: str) -> bool:
return key in self.additional_properties
Versions
- Python:
3.7.12 - openapi-python-client:
0.11.1
貢獻指南
從這裡開始
- 先讀完整個 Issue,再讀專案的貢獻指南。
- 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
- Fork 儲存庫,在一個分支上完成修改。
- 送出 Pull Request,並在描述裡引用這個 Issue 編號。
研究方向
從 openapi_python_client/utils.py 中連結的 findall 呼叫附近開始,然後追蹤 CLI 的 generate 和 update 進入點。使用 schema-underscore-collision.yaml 重現衝突,並檢查產生模型的 to_dict 和 from_dict 方法。當為 a、a 和 a 等屬性產生不同且有效的 Python 識別碼,且沒有重複欄位或關鍵字引數時,即表示完成。
由索引模型根據 Issue 內容生成。
評估
- 技術堆疊
- openapi, python
- 領域
- api, tooling
- Issue 類型
- 缺陷
- 難度
- 4/5
- 預估耗時
- 3-5 天
- 活躍度
- 停滯
- 描述清晰度
- 基本清楚
- 新手友好度
- 35/100