Metadata-Version: 2.1
Name: graphene-t2
Version: 0.2.0
Summary: An extension for graphene
Home-page: https://github.com/rustemg/graphene-t2
Author: Röstäm Gazizov
Author-email: gazizov@tn.ru
License: MIT
Keywords: api graphql graphene
Platform: UNKNOWN
Classifier: Development Status :: 3 - Alpha
Classifier: Intended Audience :: Developers
Classifier: Topic :: Software Development :: Libraries
Classifier: Programming Language :: Python :: 3
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Requires-Python: >=3.6
Description-Content-Type: text/markdown
Requires-Dist: graphene (<3,>=2.1.7)
Requires-Dist: graphene-django (<3,>=2.8)
Provides-Extra: dev
Requires-Dist: black (==19.10b0) ; extra == 'dev'
Requires-Dist: pytest (>=3.6.3) ; extra == 'dev'
Requires-Dist: pytest-django (>=3.3.2) ; extra == 'dev'
Provides-Extra: test
Requires-Dist: pytest (>=3.6.3) ; extra == 'test'
Requires-Dist: pytest-django (>=3.3.2) ; extra == 'test'

# Disclaimer
Проект находится на ранней стадии разработки

# Как пользоваться?

## Обязательные поля в инпутах
```python
import graphene
from graphene_t2 import InputObjectType

class AddSomethingInput(InputObjectType):
    field1 = graphene.String(required=True)
    field2 = graphene.String(required=True)

class EditSomethingInput(AddSomethingInput):
    class T2Meta:
        required = {
            False: '__all__', # или список полей
            True: ['id'],
        }

    id = graphene.ID()
```

### Примечания
* нет поддержки `graphene.Argument`
* порядок ключей (`True`, `False`) в параметре `required` важен. Изменения применяются в порядке их объявления


## Документирование изменений (`changes.py`)
Автоматически изменяет описание полей. Может использоваться для генерации документации.
```python
import graphene
from graphene_t2 import InputObjectType
from graphene_t2.features.changes import Alter, Deprecate

class SomeInputType(InputObjectType):
    class T2Meta:
        changes = [
            Deprecate('legacy_field1', '03/20', replaced_by='new_field1'),
            Deprecate('legacy_field2', '02/20', comment='Не используется'),
            Alter('new_field1', '03/20', required=True),
        ]

    legacy_field1 = graphene.String()
    legacy_field2 = graphene.String()
    new_field1 = graphene.String()

```


## Сортировка (`ordering.py`)
В классе-нследнике `ObjectType` нужно объявить класс `T2Meta`.
Внутри него можно создать две переменные:
1. `can_order_by` - обязательный, список с названием полей, по которым можно производить сортировку;
2. `default_ordering` - необязательный, сортировка по-умолчанию, строка или список строк с названием полей.

Примеры:
```python
class Model1Type(DjangoObjectType):
       class T2Meta:
           can_order_by = ['id']


class Model2Type(DjangoObjectType):
       class T2Meta:
           can_order_by = ['id']
           default_ordering = 'id' # или '-id'


class Model3Type(DjangoObjectType):
       class T2Meta:
           can_order_by = ['id', 'name', 'date_created']
           default_ordering = '-date_created', 'name' # или ['-date_created', 'name']
```

Класс с объявлением методов нужно отнаследовать от `graphene_t2.QueriesType`, объявить вложенный класс `T2Meta`.
Внутри объявить переменную `enable_ordering_for`. 

Возможны два вида значения:
1. `__auto__` - включает возможность сортировки, для методов для которых это возможно сделать;
2. список с названием полей

Ресолверы в качестве аргумента должны принимать `**kwargs` или `sort_by`.


```python
from graphene_t2 import QueriesType


class Query1(QueriesType):
    class T2Meta:
        enable_ordering_for = '__auto__'

    items = graphene.List(Model1Type)

    def resolve_items(self, info, **kwargs):
        pass



class Query2(QueriesType):
    class T2Meta:
        enable_ordering_for = ['items']

    items = graphene.List(Model1Type)

    def resolve_items(self, info, sort_by):
        pass
```


### Примечания
* Нет поддержки случаев, когда название поля в модели отличается от названия в API;
* Нет возможности сортировать по полям вложенных структур;


