Skip to content

Commit

Permalink
add support for URLTextInput and EmailTextInput elements
Browse files Browse the repository at this point in the history
  • Loading branch information
imryche committed May 16, 2024
1 parent cc31920 commit 910cf8c
Show file tree
Hide file tree
Showing 5 changed files with 122 additions and 5 deletions.
59 changes: 58 additions & 1 deletion blockkit/elements.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from datetime import date, datetime, time
from typing import List, Optional, Union

from pydantic import AnyUrl, Field, model_validator
from pydantic import AnyUrl, EmailStr, Field, model_validator
from pydantic.networks import HttpUrl

from blockkit.components import Component
Expand Down Expand Up @@ -52,6 +52,8 @@
"RichTextSection",
"RichTextList",
"FileInput",
"EmailTextInput",
"URLTextInput",
]


Expand Down Expand Up @@ -738,3 +740,58 @@ def __init__(
max_files=max_files,
)


class EmailTextInput(FocusableElement):
type: str = "email_text_input"
placeholder: Union[PlainText, str, None] = None
initial_value: Optional[EmailStr] = None
dispatch_action_config: Optional[DispatchActionConfig] = None

_validate_placeholder = validator(
"placeholder", validate_text_length, max_length=150
)

def __init__(
self,
*,
action_id: Optional[str] = None,
placeholder: Union[PlainText, str, None] = None,
initial_value: Optional[EmailStr] = None,
dispatch_action_config: Optional[DispatchActionConfig] = None,
focus_on_load: Optional[bool] = None,
):
super().__init__(
action_id=action_id,
placeholder=placeholder,
initial_value=initial_value,
dispatch_action_config=dispatch_action_config,
focus_on_load=focus_on_load,
)


class URLTextInput(FocusableElement):
type: str = "url_text_input"
placeholder: Union[PlainText, str, None] = None
initial_value: Optional[AnyUrl] = None
dispatch_action_config: Optional[DispatchActionConfig] = None

_validate_placeholder = validator(
"placeholder", validate_text_length, max_length=150
)

def __init__(
self,
*,
action_id: Optional[str] = None,
placeholder: Union[PlainText, str, None] = None,
initial_value: Optional[AnyUrl] = None,
dispatch_action_config: Optional[DispatchActionConfig] = None,
focus_on_load: Optional[bool] = None,
):
super().__init__(
action_id=action_id,
placeholder=placeholder,
initial_value=initial_value,
dispatch_action_config=dispatch_action_config,
focus_on_load=focus_on_load,
)
3 changes: 2 additions & 1 deletion blockkit/validators.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,4 +52,5 @@ def validate_datetime(v: Union[int, datetime]) -> Optional[int]:
else:
_ = datetime.fromtimestamp(v)
return v
return v
return v

2 changes: 1 addition & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
pytest>=6.0,<7.0
pydantic>=2,<3
pydantic[email]>=2,<3
black>=23.0
python-dateutil>=2.8,<3.0
4 changes: 2 additions & 2 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,9 @@
EMAIL = "[email protected]"
AUTHOR = "Dmitry Chernyshov"
REQUIRES_PYTHON = ">=3.7.0"
VERSION = "1.8.4"
VERSION = "1.9.0"

REQUIRED = ["pydantic>=2,<3"]
REQUIRED = ["pydantic[email]>=2,<3"]
EXTRAS = {"gen": ["black"]}

here = os.path.abspath(os.path.dirname(__file__))
Expand Down
59 changes: 59 additions & 0 deletions tests/test_elements.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
ConversationsSelect,
DatePicker,
DatetimePicker,
EmailTextInput,
ExternalSelect,
FileInput,
Image,
Expand All @@ -28,6 +29,7 @@
RichTextSection,
StaticSelect,
TimePicker,
URLTextInput,
UsersSelect,
)
from blockkit.objects import (
Expand Down Expand Up @@ -1580,3 +1582,60 @@ def test_fileinput_excessive_max_files_raises_exception():
with pytest.raises(ValidationError):
FileInput(max_files=11)


def test_builds_email_text_input():
assert EmailTextInput(
action_id="action_id",
initial_value="[email protected]",
dispatch_action_config=DispatchActionConfig(
trigger_actions_on=["on_character_entered"]
),
focus_on_load=True,
placeholder=PlainText(text="placeholder"),
).build() == {
"type": "email_text_input",
"action_id": "action_id",
"initial_value": "[email protected]",
"dispatch_action_config": {"trigger_actions_on": ["on_character_entered"]},
"focus_on_load": True,
"placeholder": {"type": "plain_text", "text": "placeholder"},
}


def test_email_text_input_excessive_placeholder_raises_exception():
with pytest.raises(ValidationError):
EmailTextInput(placeholder=PlainText(text="p" * 151))


def test_email_text_input_invalid_initial_value_raises_exception():
with pytest.raises(ValidationError):
EmailTextInput(initial_value="dimabotsignals.co")


def test_builds_url_text_input():
assert URLTextInput(
action_id="action_id",
initial_value="https://example.com/",
dispatch_action_config=DispatchActionConfig(
trigger_actions_on=["on_character_entered"]
),
focus_on_load=True,
placeholder=PlainText(text="placeholder"),
).build() == {
"type": "url_text_input",
"action_id": "action_id",
"initial_value": "https://example.com/",
"dispatch_action_config": {"trigger_actions_on": ["on_character_entered"]},
"focus_on_load": True,
"placeholder": {"type": "plain_text", "text": "placeholder"},
}


def test_url_text_input_excessive_placeholder_raises_exception():
with pytest.raises(ValidationError):
URLTextInput(placeholder=PlainText(text="p" * 151))


def test_url_text_input_invalid_initial_value_raises_exception():
with pytest.raises(ValidationError):
URLTextInput(initial_value="foo bar")

0 comments on commit 910cf8c

Please sign in to comment.