Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,11 @@ classifiers = [
]
license = "Apache-2.0"
license-files = ["LICENSE"]
dependencies = ["oauthlib>=3.3.1", "requests-oauthlib>=2.0.0"]
dependencies = [
"oauthlib>=3.3.1",
"pydantic>=2.11.7",
"requests-oauthlib>=2.0.0",
]

[dependency-groups]
dev = [
Expand Down
12 changes: 12 additions & 0 deletions src/pardner/verticals/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1,13 @@
from pardner.verticals import sub_verticals as sub_verticals
from pardner.verticals.base import BaseVertical as BaseVertical
from pardner.verticals.base import Vertical as Vertical
from pardner.verticals.blocked_user import BlockedUserVertical as BlockedUserVertical
from pardner.verticals.chat_bot import ChatBotVertical as ChatBotVertical
from pardner.verticals.conversation import ConversationVertical as ConversationVertical
from pardner.verticals.message import MessageVertical as MessageVertical
from pardner.verticals.physical_activity import (
PhysicalActivityVertical as PhysicalActivityVertical,
)
from pardner.verticals.social_posting import (
SocialPostingVertical as SocialPostingVertical,
)
22 changes: 22 additions & 0 deletions src/pardner/verticals/base.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
from abc import ABC
from datetime import datetime
from enum import StrEnum
from typing import Optional

from pydantic import AnyHttpUrl, BaseModel, Field


class Vertical(StrEnum):
"""
Expand All @@ -23,3 +27,21 @@ def __new__(cls, singular: str, plural: Optional[str] = None) -> 'Vertical':
vertical_obj._value_ = singular
vertical_obj.plural = plural if plural else f'{singular}s'
return vertical_obj


class BaseVertical(BaseModel, ABC):
"""
Base class for all verticals, except sub-verticals. Represents the verticals, or
categories of data, that are supported by this library. Not all verticals are
supported by every transfer service.
"""

id: str
creator_user_id: str
service: str = Field(
description='The name of the service the data was pulled from.'
)
vertical_name: str = Field(description='The name of the vertical, in snake case.')

created_at: datetime | None = None
url: AnyHttpUrl | None = None
8 changes: 8 additions & 0 deletions src/pardner/verticals/blocked_user.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
from pardner.verticals import BaseVertical


class BlockedUserVertical(BaseVertical):
"""An instance of a user blocked by ``creator_user_id``."""

vertical_name: str = 'blocked_user'
blocked_user_id: str
7 changes: 7 additions & 0 deletions src/pardner/verticals/chat_bot.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from pardner.verticals import BaseVertical


class ChatBotVertical(BaseVertical):
"""An instance of a chatbot created by ``creator_user_id``."""

vertical_name: str = 'chat_bot'
24 changes: 24 additions & 0 deletions src/pardner/verticals/conversation.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
from pydantic import Field

from pardner.verticals import BaseVertical
from pardner.verticals.sub_verticals import AssociatedMediaSubVertical


class ConversationVertical(BaseVertical):
"""
The metadata related to a conversation where messages are exchanged between one
or more people.
"""

vertical_name: str = 'conversation'
is_group_conversation: bool

abstract: str | None = Field(
description='A short summary, description, or bio.', default=None
)
associated_media: list[AssociatedMediaSubVertical] = []
is_private: bool | None = None
member_user_ids: list[str] = []
members_count: int | None = None
messages_count: int | None = None
title: str | None = None
15 changes: 15 additions & 0 deletions src/pardner/verticals/message.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
from pardner.verticals import BaseVertical, ConversationVertical
from pardner.verticals.sub_verticals import AssociatedMediaSubVertical


class MessageVertical(BaseVertical):
"""
A communication sent by ``creator_user_id`` and one or more
recipients. This is related to a :class:`ConversationVertical`.
"""

vertical_name: str = 'message'
parent_conversation: ConversationVertical

associated_media: list[AssociatedMediaSubVertical] = []
text: str | None = None
29 changes: 29 additions & 0 deletions src/pardner/verticals/physical_activity.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
from datetime import datetime

from pydantic import Field

from pardner.verticals.social_posting import SocialPostingVertical


class PhysicalActivityVertical(SocialPostingVertical):
"""
A social posting that contains information related to a physical activity, such
as running, swimming, or walking.
"""

vertical_name: str = 'physical_activity'

activity_type: str | None = Field(
description='The type of physical activity, such as a hike.', default=None
)
distance: float | None = Field(description='In meters.', default=None)
elevation_high: float | None = Field(description='In meters.', default=None)
elevation_low: float | None = Field(description='In meters.', default=None)
kilocalories: float | None = None
max_speed: float | None = Field(description='In meters per second.', default=None)
start_datetime: datetime | None = None
start_latitude: float | None = None
start_longitude: float | None = None
end_datetime: datetime | None = None
end_latitude: float | None = None
end_longitude: float | None = None
25 changes: 25 additions & 0 deletions src/pardner/verticals/social_posting.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
from typing import Literal

from pydantic import Field

from pardner.verticals import BaseVertical
from pardner.verticals.sub_verticals import AssociatedMediaSubVertical


class SocialPostingVertical(BaseVertical):
"""
A post on social media.
"""

vertical_name: str = 'social_posting'

abstract: str | None = Field(
description='A short summary, description, or bio.', default=None
)
associated_media: list[AssociatedMediaSubVertical] = []
interaction_count: int | None = None
keywords: list[str] = []
shared_content: list['SocialPostingVertical'] = []
status: Literal['private', 'public', 'draft', 'restricted'] | None = None
text: str | None = None
title: str | None = None
4 changes: 4 additions & 0 deletions src/pardner/verticals/sub_verticals/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
from pardner.verticals.sub_verticals.associated_media import (
AssociatedMediaSubVertical as AssociatedMediaSubVertical,
)
from pardner.verticals.sub_verticals.base import BaseSubVertical as BaseSubVertical
11 changes: 11 additions & 0 deletions src/pardner/verticals/sub_verticals/associated_media.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
from pydantic import AnyHttpUrl

from pardner.verticals.sub_verticals.base import BaseSubVertical


class AssociatedMediaSubVertical(BaseSubVertical):
"""Holds the URL for the media attached to a parent vertical."""

audio_url: AnyHttpUrl | None = None
image_url: AnyHttpUrl | None = None
video_url: AnyHttpUrl | None = None
7 changes: 7 additions & 0 deletions src/pardner/verticals/sub_verticals/base.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from abc import ABC

from pydantic import BaseModel


class BaseSubVertical(BaseModel, ABC):
pass
Loading