graphql-python / graphql-python/graphene

InputObjectType.__init_sublcass_with_meta__ skips Meta.fields attribute

オープン
#1,429 コメント 2 件 リアクション 0 件 担当者 0 名 GitHub で見る
主要言語
Python
スター
8.2k
フォーク
818
PR マージ指標
30日以内にマージされた PR はありません

説明

In `InputObjectType.__init_subclass_with_meta__`, the `fields` of the `Meta` class (passed as an `options` arg) are never referenced. This in effect just skips them completely wich stands in contradiction to the docstring.

```
Meta class options (optional):
...
fields (Dict[str, graphene.InputField]): Dictionary of field name to InputField. Not
recommended to use (prefer class attributes).
```

`InputObjectType` has to be subclassed and `__init_subclass_with_meta__` has to be extended for this feature to work, like in [graphene.tests.issues.test_720](https://github.com/graphql-python/graphene/blob/efe4b89015d56a0b6c81abc6c0b4e46984aefd11/graphene/tests/issues/test_720.py#L9).

If this is accepted I can do a PR for this along the lines:
```diff
@classmethod
+ def __init_subclass_with_meta__(cls, container=None, _meta=None, fields=None **options):
- def __init_subclass_with_meta__(cls, container=None, _meta=None, **options):
if not _meta:
_meta = InputObjectTypeOptions(cls)

+ if not fields:
+ fields = {}
- fields = {}
for base in reversed(cls.__mro__):
fields.update(yank_fields_from_attrs(base.__dict__, _as=InputField))

if _meta.fields:
_meta.fields.update(fields)
else:
_meta.fields = fields
if container is None:
container = type(cls.__name__, (InputObjectTypeContainer, cls), {})
_meta.container = container
super(InputObjectType, cls).__init_subclass_with_meta__(_meta=_meta, **options)
```

コントリビューションガイド

このリポジトリのコントリビューションガイドは索引されていません

調査の方向性

InputObjectType.__init_subclass_with_meta__ から始め、文書化されている Meta.fields オプションとの処理を比較してください。参照されている動作について graphene/tests/issues/test_720.py を確認してください。Meta.fields が保持され、InputObjectType のサブクラス化によってそれらのフィールドが破棄されないことを示すテストでカバーされれば完了です。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
graphql, python
領域
api, backend
issue の種類
バグ
難易度
2/5
見積もり時間
1〜3時間
活発さ
停滞
明瞭さ
明確に書かれている
初心者へのやさしさ
55/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。