Skip to content

Commit b00123d

Browse files
committed
Defines custom models for verticals
1 parent d8594a4 commit b00123d

File tree

13 files changed

+251
-78
lines changed

13 files changed

+251
-78
lines changed

pyproject.toml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,11 @@ classifiers = [
1414
]
1515
license = "Apache-2.0"
1616
license-files = ["LICENSE"]
17-
dependencies = ["oauthlib>=3.3.1", "requests-oauthlib>=2.0.0"]
17+
dependencies = [
18+
"oauthlib>=3.3.1",
19+
"pydantic>=2.11.7",
20+
"requests-oauthlib>=2.0.0",
21+
]
1822

1923
[dependency-groups]
2024
dev = [

src/pardner/verticals/__init__.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,13 @@
1+
from pardner.verticals import sub_verticals as sub_verticals
2+
from pardner.verticals.base import BaseVertical as BaseVertical
13
from pardner.verticals.base import Vertical as Vertical
4+
from pardner.verticals.blocked_user import BlockedUserVertical as BlockedUserVertical
5+
from pardner.verticals.chat_bot import ChatBotVertical as ChatBotVertical
6+
from pardner.verticals.conversation import ConversationVertical as ConversationVertical
7+
from pardner.verticals.message import MessageVertical as MessageVertical
8+
from pardner.verticals.physical_activity import (
9+
PhysicalActivityVertical as PhysicalActivityVertical,
10+
)
11+
from pardner.verticals.social_posting import (
12+
SocialPostingVertical as SocialPostingVertical,
13+
)

src/pardner/verticals/base.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
1+
from abc import ABC
2+
from datetime import datetime
13
from enum import StrEnum
24
from typing import Optional
35

6+
from pydantic import AnyHttpUrl, BaseModel, Field
7+
48

59
class Vertical(StrEnum):
610
"""
@@ -23,3 +27,21 @@ def __new__(cls, singular: str, plural: Optional[str] = None) -> 'Vertical':
2327
vertical_obj._value_ = singular
2428
vertical_obj.plural = plural if plural else f'{singular}s'
2529
return vertical_obj
30+
31+
32+
class BaseVertical(BaseModel, ABC):
33+
"""
34+
Base class for all verticals, except sub-verticals. Represents the verticals, or
35+
categories of data, that are supported by this library. Not all verticals are
36+
supported by every transfer service.
37+
"""
38+
39+
id: str
40+
creator_user_id: str
41+
service: str = Field(
42+
description='The name of the service the data was pulled from.'
43+
)
44+
vertical_name: str = Field(description='The name of the vertical, in snake case.')
45+
46+
created_at: datetime | None = None
47+
url: AnyHttpUrl | None = None
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
from pardner.verticals import BaseVertical
2+
3+
4+
class BlockedUserVertical(BaseVertical):
5+
"""An instance of a user blocked by ``creator_user_id``."""
6+
7+
vertical_name: str = 'blocked_user'
8+
blocked_user_id: str

src/pardner/verticals/chat_bot.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
from pardner.verticals import BaseVertical
2+
3+
4+
class ChatBotVertical(BaseVertical):
5+
"""An instance of a chatbot created by ``creator_user_id``."""
6+
7+
vertical_name: str = 'chat_bot'
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
from pydantic import Field
2+
3+
from pardner.verticals import BaseVertical
4+
from pardner.verticals.sub_verticals import AssociatedMediaSubVertical
5+
6+
7+
class ConversationVertical(BaseVertical):
8+
"""
9+
The metadata related to a conversation where messages are exchanged between one
10+
or more people.
11+
"""
12+
13+
vertical_name: str = 'conversation'
14+
is_group_conversation: bool
15+
16+
abstract: str | None = Field(
17+
description='A short summary, description, or bio.', default=None
18+
)
19+
associated_media: list[AssociatedMediaSubVertical] = []
20+
is_private: bool | None = None
21+
member_user_ids: list[str] = []
22+
members_count: int | None = None
23+
messages_count: int | None = None
24+
title: str | None = None

src/pardner/verticals/message.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
from pardner.verticals import BaseVertical, ConversationVertical
2+
from pardner.verticals.sub_verticals import AssociatedMediaSubVertical
3+
4+
5+
class MessageVertical(BaseVertical):
6+
"""
7+
A communication sent by ``creator_user_id`` and one or more
8+
recipients. This is related to a :class:`ConversationVertical`.
9+
"""
10+
11+
vertical_name: str = 'message'
12+
parent_conversation: ConversationVertical
13+
14+
associated_media: list[AssociatedMediaSubVertical] = []
15+
text: str | None = None
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
from datetime import datetime
2+
3+
from pydantic import Field
4+
5+
from pardner.verticals.social_posting import SocialPostingVertical
6+
7+
8+
class PhysicalActivityVertical(SocialPostingVertical):
9+
"""
10+
A social posting that contains information related to a physical activity, such
11+
as running, swimming, or walking.
12+
"""
13+
14+
vertical_name: str = 'physical_activity'
15+
16+
activity_type: str | None = Field(
17+
description='The type of physical activity, such as a hike.', default=None
18+
)
19+
distance: float | None = Field(description='In meters.', default=None)
20+
elevation_high: float | None = Field(description='In meters.', default=None)
21+
elevation_low: float | None = Field(description='In meters.', default=None)
22+
kilocalories: float | None = None
23+
max_speed: float | None = Field(description='In meters per second.', default=None)
24+
start_datetime: datetime | None = None
25+
start_latitude: float | None = None
26+
start_longitude: float | None = None
27+
end_datetime: datetime | None = None
28+
end_latitude: float | None = None
29+
end_longitude: float | None = None
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
from typing import Literal
2+
3+
from pydantic import Field
4+
5+
from pardner.verticals import BaseVertical
6+
from pardner.verticals.sub_verticals import AssociatedMediaSubVertical
7+
8+
9+
class SocialPostingVertical(BaseVertical):
10+
"""
11+
A post on social media.
12+
"""
13+
14+
vertical_name: str = 'social_posting'
15+
16+
abstract: str | None = Field(
17+
description='A short summary, description, or bio.', default=None
18+
)
19+
associated_media: list[AssociatedMediaSubVertical] = []
20+
interaction_count: int | None = None
21+
keywords: list[str] = []
22+
shared_content: list['SocialPostingVertical'] = []
23+
status: Literal['private', 'public', 'draft', 'restricted'] | None = None
24+
text: str | None = None
25+
title: str | None = None
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
from pardner.verticals.sub_verticals.associated_media import (
2+
AssociatedMediaSubVertical as AssociatedMediaSubVertical,
3+
)
4+
from pardner.verticals.sub_verticals.base import BaseSubVertical as BaseSubVertical

0 commit comments

Comments
 (0)