From 2745390749385623353df698e45e2312bd8e9650 Mon Sep 17 00:00:00 2001 From: nyanxyz Date: Thu, 21 Mar 2024 17:20:14 +0900 Subject: [PATCH 1/3] feat: add local validation --- alignai/client.py | 33 +++++++++++++++++++++++++++++++++ alignai/validate.py | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 alignai/validate.py diff --git a/alignai/client.py b/alignai/client.py index 43d93cf..1985cdc 100644 --- a/alignai/client.py +++ b/alignai/client.py @@ -19,6 +19,12 @@ from alignai.ingestion.v1alpha.event_pb2 import Event, EventProperties from alignai.logger import get_logger from alignai.utils import CustomProperties, datetime_to_timestamp, serialize_custom_properties +from alignai.validate import ( + ValidationError, + validate_custom_properties_or_throw, + validate_session_id_or_throw, + validate_user_id_or_throw, +) from alignai.worker import Worker @@ -76,6 +82,13 @@ def open_session( assistant_id (str, optional): Assistant ID. Defaults to "DEFAULT". custom_properties (dict[str, str] | None, optional): Custom properties associated with the session. Defaults to None. """ + validate_session_id_or_throw(session_id) + validate_user_id_or_throw(user_id) + if len(assistant_id) > 64: + raise ValidationError("assistant_id must be at most 64 characters") + if custom_properties: + validate_custom_properties_or_throw(custom_properties) + session_properties_args = {"session_id": session_id, "user_id": user_id, "assistant_id": assistant_id} open_session_event = Event( id=uuid.uuid4().hex, @@ -95,6 +108,8 @@ def close_session(self, session_id: str) -> None: Args: session_id (str): Session ID. """ + validate_session_id_or_throw(session_id) + close_session_event = Event( id=uuid.uuid4().hex, type=EventTypes.SESSION_CLOSE, @@ -125,6 +140,16 @@ def identify_user( create_time (datetime | None, optional): User creation time. Defaults to None. custom_properties (dict[str, str] | None, optional): Custom properties associated with the user. Defaults to None. """ # noqa: E501 + validate_user_id_or_throw(user_id) + if display_name and len(display_name) > 64: + raise ValidationError("display_name must be at most 64 characters") + if email and len(email) > 256: + raise ValidationError("email must be at most 256 characters") + if country_code and len(country_code) != 2: + raise ValidationError("country_code must be ISO Alpha-2 code") + if custom_properties: + validate_custom_properties_or_throw(custom_properties) + user_properties_args = {"user_id": user_id} if display_name is not None: user_properties_args["user_display_name"] = display_name @@ -166,6 +191,14 @@ def create_message( content (str): Content of the message. custom_properties (dict[str, str] | None, optional): Custom properties associated with the message. Defaults to None. """ # noqa: E501 + validate_session_id_or_throw(session_id) + if message_index <= 0: + raise ValidationError("message_index must be greater than 0") + if not content: + raise ValidationError("content is required") + if custom_properties: + validate_custom_properties_or_throw(custom_properties) + if message_index <= 0: self.logger.error(f"Invalid message index '{message_index}': Message index must be a positive integer") return diff --git a/alignai/validate.py b/alignai/validate.py new file mode 100644 index 0000000..9ebab5d --- /dev/null +++ b/alignai/validate.py @@ -0,0 +1,32 @@ +class ValidationError(Exception): + def __init__(self, message: str): + self.message = message + + def __str__(self): + return f"ValidationError: {self.message}" + + +def validate_session_id_or_throw(session_id: str): + if not session_id: + raise ValidationError("session_id is required") + if len(session_id) > 64: + raise ValidationError("session_id must be at most 64 characters") + + +def validate_user_id_or_throw(user_id: str): + if not user_id: + raise ValidationError("user_id is required") + if len(user_id) > 64: + raise ValidationError("user_id must be at most 64 characters") + + +def validate_custom_properties_or_throw(custom_properties: dict[str, str]): + if len(custom_properties) > 10: + raise ValidationError("custom_properties must have at most 10 keys") + for key, value in custom_properties.items(): + if not key: + raise ValidationError("key of custom_property is required") + if len(key) > 64: + raise ValidationError("key of custom_property must be at most 64 characters") + if len(value) > 256: + raise ValidationError("value of custom_property must be at most 256 characters") From ac67918820a031c4958685f474138819b02a7233 Mon Sep 17 00:00:00 2001 From: nyanxyz Date: Thu, 21 Mar 2024 17:44:59 +0900 Subject: [PATCH 2/3] refactor: change function name --- alignai/client.py | 22 +++++++++++----------- alignai/validate.py | 6 +++--- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/alignai/client.py b/alignai/client.py index 1985cdc..1f9d6c7 100644 --- a/alignai/client.py +++ b/alignai/client.py @@ -21,9 +21,9 @@ from alignai.utils import CustomProperties, datetime_to_timestamp, serialize_custom_properties from alignai.validate import ( ValidationError, - validate_custom_properties_or_throw, - validate_session_id_or_throw, - validate_user_id_or_throw, + validate_custom_properties_or_raise, + validate_session_id_or_raise, + validate_user_id_or_raise, ) from alignai.worker import Worker @@ -82,12 +82,12 @@ def open_session( assistant_id (str, optional): Assistant ID. Defaults to "DEFAULT". custom_properties (dict[str, str] | None, optional): Custom properties associated with the session. Defaults to None. """ - validate_session_id_or_throw(session_id) - validate_user_id_or_throw(user_id) + validate_session_id_or_raise(session_id) + validate_user_id_or_raise(user_id) if len(assistant_id) > 64: raise ValidationError("assistant_id must be at most 64 characters") if custom_properties: - validate_custom_properties_or_throw(custom_properties) + validate_custom_properties_or_raise(custom_properties) session_properties_args = {"session_id": session_id, "user_id": user_id, "assistant_id": assistant_id} open_session_event = Event( @@ -108,7 +108,7 @@ def close_session(self, session_id: str) -> None: Args: session_id (str): Session ID. """ - validate_session_id_or_throw(session_id) + validate_session_id_or_raise(session_id) close_session_event = Event( id=uuid.uuid4().hex, @@ -140,7 +140,7 @@ def identify_user( create_time (datetime | None, optional): User creation time. Defaults to None. custom_properties (dict[str, str] | None, optional): Custom properties associated with the user. Defaults to None. """ # noqa: E501 - validate_user_id_or_throw(user_id) + validate_user_id_or_raise(user_id) if display_name and len(display_name) > 64: raise ValidationError("display_name must be at most 64 characters") if email and len(email) > 256: @@ -148,7 +148,7 @@ def identify_user( if country_code and len(country_code) != 2: raise ValidationError("country_code must be ISO Alpha-2 code") if custom_properties: - validate_custom_properties_or_throw(custom_properties) + validate_custom_properties_or_raise(custom_properties) user_properties_args = {"user_id": user_id} if display_name is not None: @@ -191,13 +191,13 @@ def create_message( content (str): Content of the message. custom_properties (dict[str, str] | None, optional): Custom properties associated with the message. Defaults to None. """ # noqa: E501 - validate_session_id_or_throw(session_id) + validate_session_id_or_raise(session_id) if message_index <= 0: raise ValidationError("message_index must be greater than 0") if not content: raise ValidationError("content is required") if custom_properties: - validate_custom_properties_or_throw(custom_properties) + validate_custom_properties_or_raise(custom_properties) if message_index <= 0: self.logger.error(f"Invalid message index '{message_index}': Message index must be a positive integer") diff --git a/alignai/validate.py b/alignai/validate.py index 9ebab5d..72187e7 100644 --- a/alignai/validate.py +++ b/alignai/validate.py @@ -6,21 +6,21 @@ def __str__(self): return f"ValidationError: {self.message}" -def validate_session_id_or_throw(session_id: str): +def validate_session_id_or_raise(session_id: str): if not session_id: raise ValidationError("session_id is required") if len(session_id) > 64: raise ValidationError("session_id must be at most 64 characters") -def validate_user_id_or_throw(user_id: str): +def validate_user_id_or_raise(user_id: str): if not user_id: raise ValidationError("user_id is required") if len(user_id) > 64: raise ValidationError("user_id must be at most 64 characters") -def validate_custom_properties_or_throw(custom_properties: dict[str, str]): +def validate_custom_properties_or_raise(custom_properties: dict[str, str]): if len(custom_properties) > 10: raise ValidationError("custom_properties must have at most 10 keys") for key, value in custom_properties.items(): From a7957484c57dc7522a9f6b3c214ef4e9b862e52e Mon Sep 17 00:00:00 2001 From: Hyeonji Shin Date: Thu, 21 Mar 2024 17:48:50 +0900 Subject: [PATCH 3/3] Update alignai/validate.py Co-authored-by: Eden DongEon Kim --- alignai/validate.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/alignai/validate.py b/alignai/validate.py index 72187e7..0ff3993 100644 --- a/alignai/validate.py +++ b/alignai/validate.py @@ -1,4 +1,4 @@ -class ValidationError(Exception): +class ValidationError(ValueError): def __init__(self, message: str): self.message = message