diff --git a/.flake8 b/.flake8 new file mode 100644 index 0000000..04ca400 --- /dev/null +++ b/.flake8 @@ -0,0 +1,18 @@ +[flake8] +max-line-length = 88 +select = E,W,F,C,N +ignore = E203,E501,W503 +exclude = + .git, + __pycache__, + build, + dist, + .eggs, + *.egg-info, + .venv, + venv, + .tox +per-file-ignores = + tests/*:F401,F811 + __init__.py:F401 +max-complexity = 10 \ No newline at end of file diff --git a/wikijs/endpoints/pages.py b/wikijs/endpoints/pages.py index 306f618..8f36816 100644 --- a/wikijs/endpoints/pages.py +++ b/wikijs/endpoints/pages.py @@ -110,7 +110,7 @@ class PagesEndpoint(BaseEndpoint): """ # Build variables object - variables = {} + variables: Dict[str, Any] = {} if limit is not None: variables["limit"] = limit if offset is not None: @@ -129,10 +129,10 @@ class PagesEndpoint(BaseEndpoint): variables["orderDirection"] = order_direction # Make request with query and variables - json_data = {"query": query} + json_data: Dict[str, Any] = {"query": query} if variables: json_data["variables"] = variables - + response = self._post("/graphql", json_data=json_data) # Parse response diff --git a/wikijs/models/base.py b/wikijs/models/base.py index 70b58cf..678e471 100644 --- a/wikijs/models/base.py +++ b/wikijs/models/base.py @@ -4,7 +4,7 @@ from datetime import datetime from typing import Any, Dict, Optional from pydantic import BaseModel as PydanticBaseModel -from pydantic import ConfigDict +from pydantic import ConfigDict, field_serializer class BaseModel(PydanticBaseModel): @@ -26,8 +26,6 @@ class BaseModel(PydanticBaseModel): use_enum_values=True, # Allow extra fields for forward compatibility extra="ignore", - # Serialize datetime as ISO format - json_encoders={datetime: lambda v: v.isoformat() if v else None}, ) def to_dict(self, exclude_none: bool = True) -> Dict[str, Any]: @@ -83,6 +81,11 @@ class TimestampedModel(BaseModel): created_at: Optional[datetime] = None updated_at: Optional[datetime] = None + @field_serializer('created_at', 'updated_at') + def serialize_datetime(self, value: Optional[datetime]) -> Optional[str]: + """Serialize datetime to ISO format.""" + return value.isoformat() if value else None + @property def is_new(self) -> bool: """Check if this is a new (unsaved) model.""" diff --git a/wikijs/models/page.py b/wikijs/models/page.py index 493e782..e626bf8 100644 --- a/wikijs/models/page.py +++ b/wikijs/models/page.py @@ -3,7 +3,7 @@ import re from typing import List, Optional -from pydantic import Field, validator +from pydantic import Field, field_validator from .base import BaseModel, TimestampedModel @@ -37,7 +37,8 @@ class Page(TimestampedModel): # Editor information editor: Optional[str] = Field(None, description="Editor used") - @validator("path") + @field_validator("path") + @classmethod def validate_path(cls, v: str) -> str: """Validate page path format.""" if not v: @@ -52,7 +53,8 @@ class Page(TimestampedModel): return v - @validator("title") + @field_validator("title") + @classmethod def validate_title(cls, v: str) -> str: """Validate page title.""" if not v or not v.strip(): @@ -132,7 +134,8 @@ class PageCreate(BaseModel): locale: str = Field("en", description="Page locale") editor: str = Field("markdown", description="Editor to use") - @validator("path") + @field_validator("path") + @classmethod def validate_path(cls, v: str) -> str: """Validate page path format.""" if not v: @@ -147,7 +150,8 @@ class PageCreate(BaseModel): return v - @validator("title") + @field_validator("title") + @classmethod def validate_title(cls, v: str) -> str: """Validate page title.""" if not v or not v.strip(): @@ -172,7 +176,8 @@ class PageUpdate(BaseModel): tags: Optional[List[str]] = Field(None, description="Page tags") - @validator("title") + @field_validator("title") + @classmethod def validate_title(cls, v: Optional[str]) -> Optional[str]: """Validate page title if provided.""" if v is not None: