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
1 change: 1 addition & 0 deletions ENV.md
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ Note that some tasks/subtasks are themselves enabled by other tasks.
| `DS_APP_SYNC_META_URL_ADD_TASK_FLAG` | Adds new meta URLs to the Data Sources App|
| `DS_APP_SYNC_META_URL_UPDATE_TASK_FLAG` | Updates existing meta URLs in the Data Sources App|
| `DS_APP_SYNC_META_URL_DELETE_TASK_FLAG` | Deletes meta URLs in the Data Sources App|
| `DS_APP_SYNC_USER_FOLLOWS_GET_TASK_FLAG` | Gets user follows from the Data Sources App|
| `INTEGRITY_MONITOR_TASK_FLAG` | Runs integrity checks. |

### URL Task Flags
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
"""Add link__locations__user_follows table

Revision ID: e88e4e962dc7
Revises: 30ee666f15d1
Create Date: 2025-12-24 18:54:38.897466

"""
from typing import Sequence, Union

from alembic import op
import sqlalchemy as sa

from src.util.alembic_helpers import add_enum_value, location_id_column, user_id_column, created_at_column

# revision identifiers, used by Alembic.
revision: str = 'e88e4e962dc7'
down_revision: Union[str, None] = '30ee666f15d1'
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None

def upgrade() -> None:

Check warning on line 21 in alembic/versions/2025_12_24_1854-e88e4e962dc7_add_link__locations__user_follows_table.py

View workflow job for this annotation

GitHub Actions / flake8

[flake8] alembic/versions/2025_12_24_1854-e88e4e962dc7_add_link__locations__user_follows_table.py#L21 <103>

Missing docstring in public function
Raw output
./alembic/versions/2025_12_24_1854-e88e4e962dc7_add_link__locations__user_follows_table.py:21:1: D103 Missing docstring in public function
_add_link_locations_user_follows_table()
_add_follows_sync_task()

def _add_link_locations_user_follows_table():
op.create_table(
"link__locations__user_follows",
location_id_column(),
user_id_column(),
created_at_column(),
sa.PrimaryKeyConstraint("location_id", "user_id"),
)


def _add_follows_sync_task():
add_enum_value(
enum_name="task_type",
enum_value="Sync User Follows Get"
)

def downgrade() -> None:

Check warning on line 41 in alembic/versions/2025_12_24_1854-e88e4e962dc7_add_link__locations__user_follows_table.py

View workflow job for this annotation

GitHub Actions / flake8

[flake8] alembic/versions/2025_12_24_1854-e88e4e962dc7_add_link__locations__user_follows_table.py#L41 <103>

Missing docstring in public function
Raw output
./alembic/versions/2025_12_24_1854-e88e4e962dc7_add_link__locations__user_follows_table.py:41:1: D103 Missing docstring in public function
pass
Empty file.
Empty file.
Empty file.
56 changes: 56 additions & 0 deletions src/core/tasks/scheduled/impl/sync_from_ds/impl/follows/core.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
from src.core.tasks.scheduled.impl.sync_from_ds.impl.follows.models.user_location_pairs import UserLocationPairs

Check warning on line 1 in src/core/tasks/scheduled/impl/sync_from_ds/impl/follows/core.py

View workflow job for this annotation

GitHub Actions / flake8

[flake8] src/core/tasks/scheduled/impl/sync_from_ds/impl/follows/core.py#L1 <100>

Missing docstring in public module
Raw output
./src/core/tasks/scheduled/impl/sync_from_ds/impl/follows/core.py:1:1: D100 Missing docstring in public module
from src.core.tasks.scheduled.impl.sync_from_ds.impl.follows.query import UpdateFollowsInDBQueryBuilder
from src.core.tasks.scheduled.impl.sync_from_ds.impl.follows.types import UserID, LocationID
from src.core.tasks.scheduled.templates.operator import ScheduledTaskOperatorBase
from src.db.client.async_ import AsyncDatabaseClient
from src.db.enums import TaskType
from src.external.pdap.client import PDAPClient
from src.external.pdap.impl.sync.follows.core import GetFollowsRequestBuilder
from src.external.pdap.impl.sync.follows.response import SyncFollowGetInnerResponse


class DSAppSyncUserFollowsGetTaskOperator(ScheduledTaskOperatorBase):

Check warning on line 12 in src/core/tasks/scheduled/impl/sync_from_ds/impl/follows/core.py

View workflow job for this annotation

GitHub Actions / flake8

[flake8] src/core/tasks/scheduled/impl/sync_from_ds/impl/follows/core.py#L12 <101>

Missing docstring in public class
Raw output
./src/core/tasks/scheduled/impl/sync_from_ds/impl/follows/core.py:12:1: D101 Missing docstring in public class

def __init__(

Check warning on line 14 in src/core/tasks/scheduled/impl/sync_from_ds/impl/follows/core.py

View workflow job for this annotation

GitHub Actions / flake8

[flake8] src/core/tasks/scheduled/impl/sync_from_ds/impl/follows/core.py#L14 <107>

Missing docstring in __init__
Raw output
./src/core/tasks/scheduled/impl/sync_from_ds/impl/follows/core.py:14:1: D107 Missing docstring in __init__
self,
adb_client: AsyncDatabaseClient,
pdap_client: PDAPClient
):
super().__init__(adb_client)
self.pdap_client = pdap_client

@property
def task_type(self) -> TaskType:

Check warning on line 23 in src/core/tasks/scheduled/impl/sync_from_ds/impl/follows/core.py

View workflow job for this annotation

GitHub Actions / flake8

[flake8] src/core/tasks/scheduled/impl/sync_from_ds/impl/follows/core.py#L23 <102>

Missing docstring in public method
Raw output
./src/core/tasks/scheduled/impl/sync_from_ds/impl/follows/core.py:23:1: D102 Missing docstring in public method
return TaskType.SYNC_USER_FOLLOWS_GET

async def inner_task_logic(self) -> None:

Check warning on line 26 in src/core/tasks/scheduled/impl/sync_from_ds/impl/follows/core.py

View workflow job for this annotation

GitHub Actions / flake8

[flake8] src/core/tasks/scheduled/impl/sync_from_ds/impl/follows/core.py#L26 <102>

Missing docstring in public method
Raw output
./src/core/tasks/scheduled/impl/sync_from_ds/impl/follows/core.py:26:1: D102 Missing docstring in public method
responses = await self._get_follows_from_ds()
await self._update_follows_in_db(responses)

async def _get_follows_from_ds(self) -> list[SyncFollowGetInnerResponse]:
return await self.pdap_client.run_request_builder(
GetFollowsRequestBuilder()
)

async def _update_follows_in_db(self, responses: list[SyncFollowGetInnerResponse]) -> None:
# Get response tuples
api_pairs: list[UserLocationPairs] = [
UserLocationPairs(
user_id=UserID(response.user_id),
location_id=LocationID(response.location_id)
)
for response in responses
]
# Run query
await self.adb_client.run_query_builder(
UpdateFollowsInDBQueryBuilder(api_pairs=api_pairs)
)
#
# async def _get_follows_in_db(self) -> list[tuple[int, int]]:
# query = (
# select(
# LinkLocationUserFollow.user_id,
# LinkLocationUserFollow.location_id
# )
# )
# mappings: Sequence[RowMapping] = await self.adb_client.mappings(query)

Check warning on line 56 in src/core/tasks/scheduled/impl/sync_from_ds/impl/follows/core.py

View workflow job for this annotation

GitHub Actions / flake8

[flake8] src/core/tasks/scheduled/impl/sync_from_ds/impl/follows/core.py#L56 <292>

no newline at end of file
Raw output
./src/core/tasks/scheduled/impl/sync_from_ds/impl/follows/core.py:56:81: W292 no newline at end of file
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
"""

Design Notes:
- I contemplated having this be a simple tuple, but reasoned it'd be more future-proof
if I used a Pydantic Model, so it would fail loudly in cause the API response
structure changes.

"""

from pydantic import BaseModel

from src.core.tasks.scheduled.impl.sync_from_ds.impl.follows.types import LocationID, UserID

class UserLocationPairs(BaseModel):

Check warning on line 14 in src/core/tasks/scheduled/impl/sync_from_ds/impl/follows/models/user_location_pairs.py

View workflow job for this annotation

GitHub Actions / flake8

[flake8] src/core/tasks/scheduled/impl/sync_from_ds/impl/follows/models/user_location_pairs.py#L14 <101>

Missing docstring in public class
Raw output
./src/core/tasks/scheduled/impl/sync_from_ds/impl/follows/models/user_location_pairs.py:14:1: D101 Missing docstring in public class
user_id: UserID
location_id: LocationID

class Config:

Check warning on line 18 in src/core/tasks/scheduled/impl/sync_from_ds/impl/follows/models/user_location_pairs.py

View workflow job for this annotation

GitHub Actions / flake8

[flake8] src/core/tasks/scheduled/impl/sync_from_ds/impl/follows/models/user_location_pairs.py#L18 <106>

Missing docstring in public nested class
Raw output
./src/core/tasks/scheduled/impl/sync_from_ds/impl/follows/models/user_location_pairs.py:18:1: D106 Missing docstring in public nested class
frozen = True

Check warning on line 19 in src/core/tasks/scheduled/impl/sync_from_ds/impl/follows/models/user_location_pairs.py

View workflow job for this annotation

GitHub Actions / flake8

[flake8] src/core/tasks/scheduled/impl/sync_from_ds/impl/follows/models/user_location_pairs.py#L19 <292>

no newline at end of file
Raw output
./src/core/tasks/scheduled/impl/sync_from_ds/impl/follows/models/user_location_pairs.py:19:22: W292 no newline at end of file
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
from typing import Any, Sequence

Check warning on line 1 in src/core/tasks/scheduled/impl/sync_from_ds/impl/follows/query.py

View workflow job for this annotation

GitHub Actions / flake8

[flake8] src/core/tasks/scheduled/impl/sync_from_ds/impl/follows/query.py#L1 <100>

Missing docstring in public module
Raw output
./src/core/tasks/scheduled/impl/sync_from_ds/impl/follows/query.py:1:1: D100 Missing docstring in public module

from sqlalchemy import select, RowMapping, delete, tuple_
from sqlalchemy.ext.asyncio import AsyncSession

from src.core.tasks.scheduled.impl.sync_from_ds.impl.follows.models.user_location_pairs import UserLocationPairs
from src.core.tasks.scheduled.impl.sync_from_ds.impl.follows.types import UserID, LocationID
from src.db.models.impl.link.location__user_follow import LinkLocationUserFollow
from src.db.queries.base.builder import QueryBuilderBase

class UpdateFollowsInDBQueryBuilder(QueryBuilderBase):

Check warning on line 11 in src/core/tasks/scheduled/impl/sync_from_ds/impl/follows/query.py

View workflow job for this annotation

GitHub Actions / flake8

[flake8] src/core/tasks/scheduled/impl/sync_from_ds/impl/follows/query.py#L11 <101>

Missing docstring in public class
Raw output
./src/core/tasks/scheduled/impl/sync_from_ds/impl/follows/query.py:11:1: D101 Missing docstring in public class

def __init__(self, api_pairs: list[UserLocationPairs]):

Check warning on line 13 in src/core/tasks/scheduled/impl/sync_from_ds/impl/follows/query.py

View workflow job for this annotation

GitHub Actions / flake8

[flake8] src/core/tasks/scheduled/impl/sync_from_ds/impl/follows/query.py#L13 <107>

Missing docstring in __init__
Raw output
./src/core/tasks/scheduled/impl/sync_from_ds/impl/follows/query.py:13:1: D107 Missing docstring in __init__
super().__init__()
self.api_pairs = api_pairs

async def run(self, session: AsyncSession) -> Any:

Check warning on line 17 in src/core/tasks/scheduled/impl/sync_from_ds/impl/follows/query.py

View workflow job for this annotation

GitHub Actions / flake8

[flake8] src/core/tasks/scheduled/impl/sync_from_ds/impl/follows/query.py#L17 <102>

Missing docstring in public method
Raw output
./src/core/tasks/scheduled/impl/sync_from_ds/impl/follows/query.py:17:1: D102 Missing docstring in public method
db_pairs: list[UserLocationPairs] = await self.get_db_pairs(session)
api_pairs_set = set(self.api_pairs)
db_pairs_set = set(db_pairs)
# Get all pairs that are in the API but not in the DB
new_pairs = api_pairs_set - db_pairs_set
# Get all pairs that are in the DB but not in the API
removed_pairs = db_pairs_set - api_pairs_set

await self.add_new_links(session, new_pairs)
await self.remove_links(session, removed_pairs)


async def get_db_pairs(self, session: AsyncSession) -> list[UserLocationPairs]:

Check warning on line 30 in src/core/tasks/scheduled/impl/sync_from_ds/impl/follows/query.py

View workflow job for this annotation

GitHub Actions / flake8

[flake8] src/core/tasks/scheduled/impl/sync_from_ds/impl/follows/query.py#L30 <102>

Missing docstring in public method
Raw output
./src/core/tasks/scheduled/impl/sync_from_ds/impl/follows/query.py:30:1: D102 Missing docstring in public method

Check failure on line 30 in src/core/tasks/scheduled/impl/sync_from_ds/impl/follows/query.py

View workflow job for this annotation

GitHub Actions / flake8

[flake8] src/core/tasks/scheduled/impl/sync_from_ds/impl/follows/query.py#L30 <303>

too many blank lines (2)
Raw output
./src/core/tasks/scheduled/impl/sync_from_ds/impl/follows/query.py:30:5: E303 too many blank lines (2)
query = (
select(
LinkLocationUserFollow.user_id,
LinkLocationUserFollow.location_id
)
)
mappings: Sequence[RowMapping] = await self.sh.mappings(session, query=query)
return [
UserLocationPairs(
user_id=mapping[LinkLocationUserFollow.user_id],
location_id=mapping[LinkLocationUserFollow.location_id]
)
for mapping in mappings
]

async def add_new_links(

Check warning on line 46 in src/core/tasks/scheduled/impl/sync_from_ds/impl/follows/query.py

View workflow job for this annotation

GitHub Actions / flake8

[flake8] src/core/tasks/scheduled/impl/sync_from_ds/impl/follows/query.py#L46 <102>

Missing docstring in public method
Raw output
./src/core/tasks/scheduled/impl/sync_from_ds/impl/follows/query.py:46:1: D102 Missing docstring in public method
self,
session: AsyncSession,
pairs: set[UserLocationPairs]
) -> None:
for pair in pairs:
link = LinkLocationUserFollow(
user_id=pair.user_id,
location_id=pair.location_id
)
session.add(link)

async def remove_links(

Check warning on line 58 in src/core/tasks/scheduled/impl/sync_from_ds/impl/follows/query.py

View workflow job for this annotation

GitHub Actions / flake8

[flake8] src/core/tasks/scheduled/impl/sync_from_ds/impl/follows/query.py#L58 <102>

Missing docstring in public method
Raw output
./src/core/tasks/scheduled/impl/sync_from_ds/impl/follows/query.py:58:1: D102 Missing docstring in public method
self,
session: AsyncSession,
removed_pairs: set[UserLocationPairs]
) -> None:
tuples: list[tuple[UserID, LocationID]] = [
(pair.user_id, pair.location_id)
for pair in removed_pairs
]
statement = delete(LinkLocationUserFollow).where(
tuple_(
LinkLocationUserFollow.user_id,
LinkLocationUserFollow.location_id,
).in_(tuples)
)
await session.execute(statement)

Check warning on line 74 in src/core/tasks/scheduled/impl/sync_from_ds/impl/follows/query.py

View workflow job for this annotation

GitHub Actions / flake8

[flake8] src/core/tasks/scheduled/impl/sync_from_ds/impl/follows/query.py#L74 <391>

blank line at end of file
Raw output
./src/core/tasks/scheduled/impl/sync_from_ds/impl/follows/query.py:74:1: W391 blank line at end of file
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
from typing import NewType

Check warning on line 1 in src/core/tasks/scheduled/impl/sync_from_ds/impl/follows/types.py

View workflow job for this annotation

GitHub Actions / flake8

[flake8] src/core/tasks/scheduled/impl/sync_from_ds/impl/follows/types.py#L1 <100>

Missing docstring in public module
Raw output
./src/core/tasks/scheduled/impl/sync_from_ds/impl/follows/types.py:1:1: D100 Missing docstring in public module

UserID = NewType("UserID", int)
LocationID = NewType("LocationID", int)
10 changes: 10 additions & 0 deletions src/core/tasks/scheduled/loader.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
from src.core.tasks.scheduled.impl.mark_never_completed.operator import MarkTaskNeverCompletedOperator
from src.core.tasks.scheduled.impl.refresh_materialized_views.operator import RefreshMaterializedViewsOperator
from src.core.tasks.scheduled.impl.run_url_tasks.operator import RunURLTasksTaskOperator
from src.core.tasks.scheduled.impl.sync_from_ds.impl.follows.core import DSAppSyncUserFollowsGetTaskOperator
from src.core.tasks.scheduled.impl.sync_to_ds.impl.agencies.add.core import DSAppSyncAgenciesAddTaskOperator
from src.core.tasks.scheduled.impl.sync_to_ds.impl.agencies.delete.core import DSAppSyncAgenciesDeleteTaskOperator
from src.core.tasks.scheduled.impl.sync_to_ds.impl.agencies.update.core import DSAppSyncAgenciesUpdateTaskOperator
Expand Down Expand Up @@ -136,6 +137,15 @@
enabled=self.setup_flag("INTEGRITY_MONITOR_TASK_FLAG")
),
# Sync
## Get

Check failure on line 140 in src/core/tasks/scheduled/loader.py

View workflow job for this annotation

GitHub Actions / flake8

[flake8] src/core/tasks/scheduled/loader.py#L140 <266>

too many leading '#' for block comment
Raw output
./src/core/tasks/scheduled/loader.py:140:13: E266 too many leading '#' for block comment
ScheduledTaskEntry(
operator=DSAppSyncUserFollowsGetTaskOperator(
adb_client=self.adb_client,
pdap_client=self.pdap_client
),
interval_minutes=IntervalEnum.DAILY.value,
enabled=self.setup_flag("DS_APP_SYNC_USER_FOLLOWS_GET_TASK_FLAG")
),
## Adds
### Agency
ScheduledTaskEntry(
Expand Down
1 change: 1 addition & 0 deletions src/db/enums.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ class TaskType(PyEnum):
SYNC_META_URLS_ADD = "Sync Meta URLs Add"
SYNC_META_URLS_UPDATE = "Sync Meta URLs Update"
SYNC_META_URLS_DELETE = "Sync Meta URLs Delete"
SYNC_USER_FOLLOWS_GET = "Sync User Follows Get"

class ChangeLogOperationType(PyEnum):
INSERT = "INSERT"
Expand Down
20 changes: 20 additions & 0 deletions src/db/models/impl/link/location__user_follow.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
from sqlalchemy import Integer, Column, PrimaryKeyConstraint

Check warning on line 1 in src/db/models/impl/link/location__user_follow.py

View workflow job for this annotation

GitHub Actions / flake8

[flake8] src/db/models/impl/link/location__user_follow.py#L1 <100>

Missing docstring in public module
Raw output
./src/db/models/impl/link/location__user_follow.py:1:1: D100 Missing docstring in public module

from src.db.models.mixins import LocationDependentMixin, CreatedAtMixin
from src.db.models.templates_.base import Base


class LinkLocationUserFollow(

Check warning on line 7 in src/db/models/impl/link/location__user_follow.py

View workflow job for this annotation

GitHub Actions / flake8

[flake8] src/db/models/impl/link/location__user_follow.py#L7 <101>

Missing docstring in public class
Raw output
./src/db/models/impl/link/location__user_follow.py:7:1: D101 Missing docstring in public class
Base,
LocationDependentMixin,
CreatedAtMixin
):
__tablename__ = "link__locations__user_follows"
__table_args__ = (
PrimaryKeyConstraint(
"user_id",
"location_id"
),
)

user_id = Column(Integer, nullable=False)
18 changes: 17 additions & 1 deletion src/external/pdap/_templates/request_builder.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
from abc import ABC, abstractmethod
from http import HTTPStatus
from typing import Any
from typing import Any, TypeVar

from pdap_access_manager.access_manager.async_ import AccessManagerAsync
from pdap_access_manager.enums import RequestType
from pdap_access_manager.models.request import RequestInfo
from pdap_access_manager.models.response import ResponseInfo
from pydantic import BaseModel

T = TypeVar("T", bound=BaseModel)

class PDAPRequestBuilderBase(ABC):

Expand Down Expand Up @@ -37,6 +38,21 @@
raise Exception(f"Failed to make request to PDAP: {response_info.data}")
return response_info.data

async def get(

Check warning on line 41 in src/external/pdap/_templates/request_builder.py

View workflow job for this annotation

GitHub Actions / flake8

[flake8] src/external/pdap/_templates/request_builder.py#L41 <102>

Missing docstring in public method
Raw output
./src/external/pdap/_templates/request_builder.py:41:1: D102 Missing docstring in public method
self,
url: str,
model: type[T]
) -> T:
request_info = RequestInfo(
type_=RequestType.GET,
url=url,
headers=await self.access_manager.jwt_header()
)
response_info: ResponseInfo = await self.access_manager.make_request(request_info)
if response_info.status_code != HTTPStatus.OK:
raise Exception(f"Failed to make request to PDAP: {response_info.data}")
return model(**response_info.data)

@abstractmethod
async def inner_logic(self) -> Any:
raise NotImplementedError
Empty file.
13 changes: 13 additions & 0 deletions src/external/pdap/impl/sync/follows/core.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
from src.external.pdap._templates.request_builder import PDAPRequestBuilderBase

Check warning on line 1 in src/external/pdap/impl/sync/follows/core.py

View workflow job for this annotation

GitHub Actions / flake8

[flake8] src/external/pdap/impl/sync/follows/core.py#L1 <100>

Missing docstring in public module
Raw output
./src/external/pdap/impl/sync/follows/core.py:1:1: D100 Missing docstring in public module
from src.external.pdap.impl.sync.follows.response import SyncFollowGetInnerResponse, SyncFollowGetOuterResponse


class GetFollowsRequestBuilder(PDAPRequestBuilderBase):

Check warning on line 5 in src/external/pdap/impl/sync/follows/core.py

View workflow job for this annotation

GitHub Actions / flake8

[flake8] src/external/pdap/impl/sync/follows/core.py#L5 <101>

Missing docstring in public class
Raw output
./src/external/pdap/impl/sync/follows/core.py:5:1: D101 Missing docstring in public class

async def inner_logic(self) -> list[SyncFollowGetInnerResponse]:

Check warning on line 7 in src/external/pdap/impl/sync/follows/core.py

View workflow job for this annotation

GitHub Actions / flake8

[flake8] src/external/pdap/impl/sync/follows/core.py#L7 <102>

Missing docstring in public method
Raw output
./src/external/pdap/impl/sync/follows/core.py:7:1: D102 Missing docstring in public method
url: str = self.build_url("v3/sync/follows")
response: SyncFollowGetOuterResponse = await self.get(
url=url,
model=SyncFollowGetOuterResponse
)
return response.follows
9 changes: 9 additions & 0 deletions src/external/pdap/impl/sync/follows/response.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
from pydantic import BaseModel

Check warning on line 1 in src/external/pdap/impl/sync/follows/response.py

View workflow job for this annotation

GitHub Actions / flake8

[flake8] src/external/pdap/impl/sync/follows/response.py#L1 <100>

Missing docstring in public module
Raw output
./src/external/pdap/impl/sync/follows/response.py:1:1: D100 Missing docstring in public module


class SyncFollowGetInnerResponse(BaseModel):

Check warning on line 4 in src/external/pdap/impl/sync/follows/response.py

View workflow job for this annotation

GitHub Actions / flake8

[flake8] src/external/pdap/impl/sync/follows/response.py#L4 <101>

Missing docstring in public class
Raw output
./src/external/pdap/impl/sync/follows/response.py:4:1: D101 Missing docstring in public class
user_id: int
location_id: int

class SyncFollowGetOuterResponse(BaseModel):

Check warning on line 8 in src/external/pdap/impl/sync/follows/response.py

View workflow job for this annotation

GitHub Actions / flake8

[flake8] src/external/pdap/impl/sync/follows/response.py#L8 <101>

Missing docstring in public class
Raw output
./src/external/pdap/impl/sync/follows/response.py:8:1: D101 Missing docstring in public class
follows: list[SyncFollowGetInnerResponse]
Loading