Skip to content

Commit 910cf8c

Browse files
committed
add support for URLTextInput and EmailTextInput elements
1 parent cc31920 commit 910cf8c

File tree

5 files changed

+122
-5
lines changed

5 files changed

+122
-5
lines changed

blockkit/elements.py

Lines changed: 58 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from datetime import date, datetime, time
33
from typing import List, Optional, Union
44

5-
from pydantic import AnyUrl, Field, model_validator
5+
from pydantic import AnyUrl, EmailStr, Field, model_validator
66
from pydantic.networks import HttpUrl
77

88
from blockkit.components import Component
@@ -52,6 +52,8 @@
5252
"RichTextSection",
5353
"RichTextList",
5454
"FileInput",
55+
"EmailTextInput",
56+
"URLTextInput",
5557
]
5658

5759

@@ -738,3 +740,58 @@ def __init__(
738740
max_files=max_files,
739741
)
740742

743+
744+
class EmailTextInput(FocusableElement):
745+
type: str = "email_text_input"
746+
placeholder: Union[PlainText, str, None] = None
747+
initial_value: Optional[EmailStr] = None
748+
dispatch_action_config: Optional[DispatchActionConfig] = None
749+
750+
_validate_placeholder = validator(
751+
"placeholder", validate_text_length, max_length=150
752+
)
753+
754+
def __init__(
755+
self,
756+
*,
757+
action_id: Optional[str] = None,
758+
placeholder: Union[PlainText, str, None] = None,
759+
initial_value: Optional[EmailStr] = None,
760+
dispatch_action_config: Optional[DispatchActionConfig] = None,
761+
focus_on_load: Optional[bool] = None,
762+
):
763+
super().__init__(
764+
action_id=action_id,
765+
placeholder=placeholder,
766+
initial_value=initial_value,
767+
dispatch_action_config=dispatch_action_config,
768+
focus_on_load=focus_on_load,
769+
)
770+
771+
772+
class URLTextInput(FocusableElement):
773+
type: str = "url_text_input"
774+
placeholder: Union[PlainText, str, None] = None
775+
initial_value: Optional[AnyUrl] = None
776+
dispatch_action_config: Optional[DispatchActionConfig] = None
777+
778+
_validate_placeholder = validator(
779+
"placeholder", validate_text_length, max_length=150
780+
)
781+
782+
def __init__(
783+
self,
784+
*,
785+
action_id: Optional[str] = None,
786+
placeholder: Union[PlainText, str, None] = None,
787+
initial_value: Optional[AnyUrl] = None,
788+
dispatch_action_config: Optional[DispatchActionConfig] = None,
789+
focus_on_load: Optional[bool] = None,
790+
):
791+
super().__init__(
792+
action_id=action_id,
793+
placeholder=placeholder,
794+
initial_value=initial_value,
795+
dispatch_action_config=dispatch_action_config,
796+
focus_on_load=focus_on_load,
797+
)

blockkit/validators.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,4 +52,5 @@ def validate_datetime(v: Union[int, datetime]) -> Optional[int]:
5252
else:
5353
_ = datetime.fromtimestamp(v)
5454
return v
55-
return v
55+
return v
56+

requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
pytest>=6.0,<7.0
2-
pydantic>=2,<3
2+
pydantic[email]>=2,<3
33
black>=23.0
44
python-dateutil>=2.8,<3.0

setup.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@
1313
1414
AUTHOR = "Dmitry Chernyshov"
1515
REQUIRES_PYTHON = ">=3.7.0"
16-
VERSION = "1.8.4"
16+
VERSION = "1.9.0"
1717

18-
REQUIRED = ["pydantic>=2,<3"]
18+
REQUIRED = ["pydantic[email]>=2,<3"]
1919
EXTRAS = {"gen": ["black"]}
2020

2121
here = os.path.abspath(os.path.dirname(__file__))

tests/test_elements.py

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
ConversationsSelect,
1212
DatePicker,
1313
DatetimePicker,
14+
EmailTextInput,
1415
ExternalSelect,
1516
FileInput,
1617
Image,
@@ -28,6 +29,7 @@
2829
RichTextSection,
2930
StaticSelect,
3031
TimePicker,
32+
URLTextInput,
3133
UsersSelect,
3234
)
3335
from blockkit.objects import (
@@ -1580,3 +1582,60 @@ def test_fileinput_excessive_max_files_raises_exception():
15801582
with pytest.raises(ValidationError):
15811583
FileInput(max_files=11)
15821584

1585+
1586+
def test_builds_email_text_input():
1587+
assert EmailTextInput(
1588+
action_id="action_id",
1589+
initial_value="[email protected]",
1590+
dispatch_action_config=DispatchActionConfig(
1591+
trigger_actions_on=["on_character_entered"]
1592+
),
1593+
focus_on_load=True,
1594+
placeholder=PlainText(text="placeholder"),
1595+
).build() == {
1596+
"type": "email_text_input",
1597+
"action_id": "action_id",
1598+
"initial_value": "[email protected]",
1599+
"dispatch_action_config": {"trigger_actions_on": ["on_character_entered"]},
1600+
"focus_on_load": True,
1601+
"placeholder": {"type": "plain_text", "text": "placeholder"},
1602+
}
1603+
1604+
1605+
def test_email_text_input_excessive_placeholder_raises_exception():
1606+
with pytest.raises(ValidationError):
1607+
EmailTextInput(placeholder=PlainText(text="p" * 151))
1608+
1609+
1610+
def test_email_text_input_invalid_initial_value_raises_exception():
1611+
with pytest.raises(ValidationError):
1612+
EmailTextInput(initial_value="dimabotsignals.co")
1613+
1614+
1615+
def test_builds_url_text_input():
1616+
assert URLTextInput(
1617+
action_id="action_id",
1618+
initial_value="https://example.com/",
1619+
dispatch_action_config=DispatchActionConfig(
1620+
trigger_actions_on=["on_character_entered"]
1621+
),
1622+
focus_on_load=True,
1623+
placeholder=PlainText(text="placeholder"),
1624+
).build() == {
1625+
"type": "url_text_input",
1626+
"action_id": "action_id",
1627+
"initial_value": "https://example.com/",
1628+
"dispatch_action_config": {"trigger_actions_on": ["on_character_entered"]},
1629+
"focus_on_load": True,
1630+
"placeholder": {"type": "plain_text", "text": "placeholder"},
1631+
}
1632+
1633+
1634+
def test_url_text_input_excessive_placeholder_raises_exception():
1635+
with pytest.raises(ValidationError):
1636+
URLTextInput(placeholder=PlainText(text="p" * 151))
1637+
1638+
1639+
def test_url_text_input_invalid_initial_value_raises_exception():
1640+
with pytest.raises(ValidationError):
1641+
URLTextInput(initial_value="foo bar")

0 commit comments

Comments
 (0)