Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

HH-127328 argument validation improvement #502

Merged
merged 1 commit into from
May 25, 2021
Merged

HH-127328 argument validation improvement #502

merged 1 commit into from
May 25, 2021

Conversation

sintell
Copy link
Member

@sintell sintell commented Apr 7, 2021

https://jira.hh.ru/browse/HH-127328
Решаю проблему ,когда get_validated_argument() вызывается на квере следующего вида:
some_value=123&empty_value=, в текущей реализации empty_value будет иметь значение '', что не позволит использовать дефолт, но не пройдет валидацию на int()

  • поменял имена у методов, чтобы они соответствовали именам питонячих типов
  • обновил доку
  • добавил проверку дефолтного значения на соответствие валидатору
  • валидация теперь всегда пытается вернуть значение по умолчанию

frontik/handler.py Outdated Show resolved Hide resolved
frontik/handler.py Outdated Show resolved Hide resolved
frontik/handler.py Outdated Show resolved Hide resolved
@ipetropolsky
Copy link
Member

Дефолт вместо пустой строки — это не совсем то, чего ожидаешь, и отличается от поведения get_argument. Давай не будем так делать, а оставим тут только типизацию.

frontik/handler.py Outdated Show resolved Hide resolved
Copy link
Contributor

@xtabay xtabay left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ок, только какой-то лишний пробел перед kwargs

@sintell sintell force-pushed the HH-127328 branch 2 times, most recently from 71f489a to c022cc5 Compare April 20, 2021 15:03

try:
validator = validation.value
params = {validator: value}
validated_value = self._validation_model(**params).dict().get(validator)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Просто для истории, что тут происходит (очевидно же).

Вместо полей модели pydantic у нас типы аргументов: string, integer, etc, по дефолту всё None.
Соответственно, для строкового аргумента создаём модель с единственным полем string, для числового — с полем integer и т.д.

self._validation_model(**params).dict().get(validator)

Превращается в это:

>>> BaseValidationModel(**{Validators.STRING.value: '123'}).dict().get(Validators.STRING.value)
'123'

Или, после сокращений:

>>> BaseValidationModel(string='123').dict().get('string')
'123'

Получаем обработанное значение по тем же именам типов-полей:

>>> BaseValidationModel(string='123').dict().get('string')
'123'
>>> BaseValidationModel(string='123').dict().get('integer')
None
>>> BaseValidationModel(string=123).dict().get('integer')
None
>>> BaseValidationModel(integer=123).dict().get('integer')
123
>>> BaseValidationModel(integer=123).dict().get('string')
None

@sintell sintell force-pushed the HH-127328 branch 2 times, most recently from e88d798 to 6ce121a Compare May 14, 2021 16:30
@sintell sintell force-pushed the HH-127328 branch 2 times, most recently from 8300a33 to b9f8b03 Compare May 25, 2021 12:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants