Skip to content

Филиппов Денис Task3 - #3

Open
df530 wants to merge 4 commits into
mainfrom
task3
Open

Филиппов Денис Task3#3
df530 wants to merge 4 commits into
mainfrom
task3

Conversation

@df530

@df530df530 commented Oct 5, 2021

Copy link
Copy Markdown
Owner

No description provided.

@df530

df530 commented Oct 5, 2021

Copy link
Copy Markdown
OwnerAuthor

Я по началу попробовал поменять решение предыдущего задания, добавить новые поля к старым классам и т.п. Но получить потом нахаляву GraphQL type, просто наследовав новые классы от новых, у меня не получилось (либо это в принципе невозможно, либо я что-то не так делал). В итоге я создал просто отдельный файл для экспериментов с GraphQL -- файл strawberry_type.py, и там все нужные типы и методы задал.

@katunilyakatunilya left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Основное ДЗ засчитано

Comment threadREADME.md
Comment on lines +42 to +43
Перед тестированием установите:
`pip install email-validator`

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

посмотрите poetry - позволяет удобно разделять зависимости dev и prod

Comment threadstrawberry_types.py
Comment on lines +5 to +9
@strawberry.type
class Date:
year: int
month: int
day: int

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

strawberryподдерживает datetime стандартный, так что можно было его просто использовать

Comment threadstrawberry_types.py
Comment on lines +29 to +46
return list(filter(lambda u: u.additional_info.birth_date.year == year, [
UserMeta(
"hello@world.ru",
"Mike",
AdditionalInfo(
"I am a hero",
Date(2001, 1, 1)
)
),
UserMeta(
"hi@world.ru",
"Pol",
AdditionalInfo(
"DevOps",
Date(1001, 1, 1)
)
),
]))

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

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


@validator('name')
def name_alphanumeric(cls, v):
assert v.isalnum(), 'must be alphanumeric'

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

assert, вообще говоря, не очень хорошо использовать в логике (в тестах - норм). линтеры проверяющие секьюрность на него ругаются, например вот, что думает об assertbandit

Comment threadutils.py
Comment on lines +5 to +17
def validate_new_password(pwd: SecretStr):
value = pwd.get_secret_value()
if re.search(r"[a-z]", value) is None:
raise ValueError("password must contain lowercase letter", r"[a-z]")
if re.search(r"[A-Z]", value) is None:
raise ValueError("password must contain uppercase letter", r"[A-Z]")
if re.search(r"[0-9]", value) is None:
raise ValueError("password must contain digit", r"[0-9]")
if re.search(r"[!@#_.]", value) is None:
raise ValueError("password must contain special character '!', '@', '#', '_' or '.'", r"[!@#_.]")
m = re.search(r"[^a-zA-Z0-9!@#_.]", value)
if m is not None:
raise ValueError("password contains forbidden character " + m.group(0), "wrong char")

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

В ситуации, когда регулярное выражение заранее известно, гораздо эффективнее его скомпилировать заранее, т.к. работают они довольно медленно.

Например, можно сделать так:

checkups= [
(re.compile(r"[a-z]"), "password must contain lowercase letter"),
...
]
defvalidate_new_password(pwd: SecretStr):
value=pwd.get_secret_value()
forcheckupincheckups:
ifcheckup[0].search(value) isNone:
raiseValueError(checkup[1])
...

тут нужно подумать, как красивее сделать последнее условие, но глобально скомпилить их заранее лучше, чем делать это каждый раз

Sign up for freeto 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.

2 participants

@df530@katunilya