aboutsummaryrefslogtreecommitdiff
path: root/jb/models
diff options
context:
space:
mode:
authorMax Nanis2026-09-09 20:32:17 -0700
committerMax Nanis2026-09-09 20:32:17 -0700
commit832aecaddce80e312095ecdb572d7756eb9df5e9 (patch)
tree3f9b27bf285ef0648e22a1480ab213255d2cfee6 /jb/models
parente7e5b5f8bf81e78e417ecdb9dd6ab1616e722fa0 (diff)
downloadamt-jb-832aecaddce80e312095ecdb572d7756eb9df5e9.tar.gz
amt-jb-832aecaddce80e312095ecdb572d7756eb9df5e9.zip
Ruff auto fix, and requirements bump
Diffstat (limited to 'jb/models')
-rw-r--r--jb/models/__init__.py5
-rw-r--r--jb/models/assignment.py24
-rw-r--r--jb/models/bonus.py12
-rw-r--r--jb/models/custom_types.py7
-rw-r--r--jb/models/errors.py2
-rw-r--r--jb/models/event.py6
-rw-r--r--jb/models/hit.py42
7 files changed, 47 insertions, 51 deletions
diff --git a/jb/models/__init__.py b/jb/models/__init__.py
index 0aeae14..7fe23a7 100644
--- a/jb/models/__init__.py
+++ b/jb/models/__init__.py
@@ -1,7 +1,6 @@
from decimal import Decimal
-from typing import Optional
-from pydantic import BaseModel, Field, ConfigDict
+from pydantic import BaseModel, ConfigDict, Field
class HTTPHeaders(BaseModel):
@@ -12,7 +11,7 @@ class HTTPHeaders(BaseModel):
# 'Mon, 15 Jan 2024 23:40:32 GMT'
date: str = Field()
- connection: Optional[str] = Field(default=None) # 'close'
+ connection: str | None = Field(default=None) # 'close'
class ResponseMetadata(BaseModel):
diff --git a/jb/models/assignment.py b/jb/models/assignment.py
index 92e5a89..775cd63 100644
--- a/jb/models/assignment.py
+++ b/jb/models/assignment.py
@@ -1,17 +1,17 @@
import logging
from datetime import datetime, timezone
-from typing import Optional, TypedDict, Any
+from typing import Any, TypedDict
from xml.etree import ElementTree
from mypy_boto3_mturk.type_defs import AssignmentTypeDef
from pydantic import (
BaseModel,
- Field,
ConfigDict,
- model_validator,
+ Field,
PositiveInt,
TypeAdapter,
ValidationError,
+ model_validator,
)
from typing_extensions import Self
@@ -36,8 +36,8 @@ class AssignmentStub(BaseModel):
validate_assignment=True,
)
- id: Optional[PositiveInt] = Field(default=None)
- hit_id: Optional[PositiveInt] = Field(default=None)
+ id: PositiveInt | None = Field(default=None)
+ hit_id: PositiveInt | None = Field(default=None)
amt_assignment_id: AMTBoto3ID = Field()
amt_hit_id: AMTBoto3ID = Field()
amt_worker_id: str = Field(min_length=3, max_length=50)
@@ -50,7 +50,7 @@ class AssignmentStub(BaseModel):
description="When this record was saved in the database",
)
- modified_at: Optional[AwareDatetimeISO] = Field(
+ modified_at: AwareDatetimeISO | None = Field(
default_factory=lambda: datetime.now(tz=timezone.utc),
description="When this record was updated / modified in the database",
)
@@ -96,18 +96,18 @@ class Assignment(AssignmentStub):
"submitted results.",
)
- approval_time: Optional[AwareDatetimeISO] = Field(
+ approval_time: AwareDatetimeISO | None = Field(
default=None,
description="The date and time the Requester approved the results. This "
"value is omitted from the assignment if the Requester has "
"not yet approved the results.",
)
- rejection_time: Optional[AwareDatetimeISO] = Field(
+ rejection_time: AwareDatetimeISO | None = Field(
default=None,
description="The date and time the Requester rejected the results.",
)
- requester_feedback: Optional[str] = Field(
+ requester_feedback: str | None = Field(
# Default: None. This field isn't returned with assignment data by
# default. To request this field, specify a response group of
# AssignmentFeedback. For information about response groups, see
@@ -123,11 +123,11 @@ class Assignment(AssignmentStub):
},
)
- answer_xml: Optional[str] = Field(default=None, exclude=True)
+ answer_xml: str | None = Field(default=None, exclude=True)
# GRL Specific
- tsid: Optional[UUIDStr] = Field(default=None)
+ tsid: UUIDStr | None = Field(default=None)
# --- Validators ---
@@ -173,7 +173,7 @@ class Assignment(AssignmentStub):
# --- Properties ---
@property
- def answers_dict(self) -> Optional[AnswerDict]:
+ def answers_dict(self) -> AnswerDict | None:
# See https://docs.aws.amazon.com/AWSMechTurk/latest/AWSMturkAPI/ApiReference_AssignmentDataStructureArticle.html
# https://docs.aws.amazon.com/AWSMechTurk/latest/AWSMechanicalTurkRequester/Concepts_NotificationsArticle.html
if self.answer_xml is None:
diff --git a/jb/models/bonus.py b/jb/models/bonus.py
index 5f81add..2c1d00c 100644
--- a/jb/models/bonus.py
+++ b/jb/models/bonus.py
@@ -1,9 +1,9 @@
-from typing import Optional, Dict, Any
+from typing import Any
-from pydantic import BaseModel, Field, ConfigDict, PositiveInt
+from generalresearch.currency import USDCent
+from pydantic import BaseModel, ConfigDict, Field, PositiveInt
from typing_extensions import Self
-from generalresearch.currency import USDCent
from jb.models.custom_types import AMTBoto3ID, AwareDatetimeISO, UUIDStr
@@ -20,8 +20,8 @@ class Bonus(BaseModel):
extra="forbid",
validate_assignment=True,
)
- id: Optional[PositiveInt] = Field(default=None)
- assignment_id: Optional[PositiveInt] = Field(default=None)
+ id: PositiveInt | None = Field(default=None)
+ assignment_id: PositiveInt | None = Field(default=None)
amt_worker_id: str = Field(min_length=3, max_length=50)
amt_assignment_id: AMTBoto3ID = Field()
@@ -40,7 +40,7 @@ class Bonus(BaseModel):
return d
@classmethod
- def from_postgres(cls, data: Dict[str, Any]) -> Self:
+ def from_postgres(cls, data: dict[str, Any]) -> Self:
data["amount"] = USDCent(round(data["amount"] * 100))
fields = set(cls.model_fields.keys())
data = {k: v for k, v in data.items() if k in fields}
diff --git a/jb/models/custom_types.py b/jb/models/custom_types.py
index 10bc9d1..a58dcb7 100644
--- a/jb/models/custom_types.py
+++ b/jb/models/custom_types.py
@@ -1,19 +1,18 @@
import re
from datetime import datetime, timezone
-from typing import Any, Optional
+from typing import Annotated, Any
from uuid import UUID
from pydantic import (
AwareDatetime,
+ HttpUrl,
StringConstraints,
TypeAdapter,
- HttpUrl,
)
from pydantic.functional_serializers import PlainSerializer
from pydantic.functional_validators import AfterValidator, BeforeValidator
from pydantic.networks import UrlConstraints
from pydantic_core import Url
-from typing_extensions import Annotated
def convert_datetime_to_iso_8601_with_z_suffix(dt: datetime) -> str:
@@ -22,7 +21,7 @@ def convert_datetime_to_iso_8601_with_z_suffix(dt: datetime) -> str:
return dt.strftime("%Y-%m-%dT%H:%M:%S.%fZ")
-def convert_str_dt(v: Any) -> Optional[AwareDatetime]:
+def convert_str_dt(v: Any) -> AwareDatetime | None:
# By default, pydantic is unable to handle tz-aware isoformat str. Attempt to parse a str
# that was dumped using the iso8601 format with Z suffix.
if v is not None and type(v) is str:
diff --git a/jb/models/errors.py b/jb/models/errors.py
index 94f5fbb..c590c6a 100644
--- a/jb/models/errors.py
+++ b/jb/models/errors.py
@@ -1,7 +1,7 @@
import re
from enum import Enum
-from pydantic import BaseModel, Field, ConfigDict, model_validator
+from pydantic import BaseModel, ConfigDict, Field, model_validator
from jb.models import ResponseMetadata
diff --git a/jb/models/event.py b/jb/models/event.py
index f8867c0..0016ca7 100644
--- a/jb/models/event.py
+++ b/jb/models/event.py
@@ -1,9 +1,9 @@
-from typing import Dict, Any
+from typing import Any
from mypy_boto3_mturk.literals import EventTypeType
from pydantic import BaseModel, Field
-from jb.models.custom_types import AwareDatetimeISO, AMTBoto3ID
+from jb.models.custom_types import AMTBoto3ID, AwareDatetimeISO
class MTurkEvent(BaseModel):
@@ -29,7 +29,7 @@ class MTurkEvent(BaseModel):
)
@classmethod
- def from_sns(cls, data: Dict[str, Any]):
+ def from_sns(cls, data: dict[str, Any]):
return cls.model_validate(
{
"event_type": data["EventType"],
diff --git a/jb/models/hit.py b/jb/models/hit.py
index 45478fc..f6c854f 100644
--- a/jb/models/hit.py
+++ b/jb/models/hit.py
@@ -1,25 +1,25 @@
-from datetime import datetime, timezone, timedelta
-from typing import Optional, List, Dict, Any
+from datetime import datetime, timedelta, timezone
+from typing import Any
from uuid import uuid4
from xml.etree import ElementTree
+from generalresearch.currency import USDCent
from mypy_boto3_mturk.type_defs import HITTypeDef
from pydantic import (
BaseModel,
- Field,
- PositiveInt,
ConfigDict,
+ Field,
NonNegativeInt,
+ PositiveInt,
)
from typing_extensions import Self
-from generalresearch.currency import USDCent
-from jb.models.custom_types import AMTBoto3ID, HttpsUrlStr, AwareDatetimeISO
-from jb.models.definitions import HitStatus, HitReviewStatus
+from jb.models.custom_types import AMTBoto3ID, AwareDatetimeISO, HttpsUrlStr
+from jb.models.definitions import HitReviewStatus, HitStatus
class HitQuestion(BaseModel):
- id: Optional[PositiveInt] = Field(default=None)
+ id: PositiveInt | None = Field(default=None)
url: HttpsUrlStr = Field()
height: PositiveInt = Field(default=1_200, ge=100, le=4_000)
@@ -33,7 +33,7 @@ class HitQuestion(BaseModel):
def xml(self) -> str:
return f"""<?xml version="1.0" encoding="UTF-8"?>
<ExternalQuestion xmlns="http://mechanicalturk.amazonaws.com/AWSMechanicalTurkDataSchemas/2006-07-14/ExternalQuestion.xsd">
- <ExternalURL>{str(self.url)}</ExternalURL>
+ <ExternalURL>{self.url!s}</ExternalURL>
<FrameHeight>{self.height}</FrameHeight>
</ExternalQuestion>"""
@@ -82,8 +82,8 @@ class HitType(HitTypeCommon):
https://docs.aws.amazon.com/AWSMechTurk/latest/AWSMturkAPI/ApiReference_CreateHITTypeOperation.html
"""
- id: Optional[PositiveInt] = Field(default=None)
- amt_hit_type_id: Optional[AMTBoto3ID] = Field(default=None)
+ id: PositiveInt | None = Field(default=None)
+ amt_hit_type_id: AMTBoto3ID | None = Field(default=None)
# --- GRL Specific ---
min_active: NonNegativeInt = Field(default=0, le=100_000)
@@ -104,11 +104,11 @@ class HitType(HitTypeCommon):
return d
@classmethod
- def from_postgres(cls, data: Dict[str, Any]) -> Self:
+ def from_postgres(cls, data: dict[str, Any]) -> Self:
data["reward"] = USDCent(round(data["reward"] * 100))
return cls.model_validate(data)
- def generate_hit_amt_request(self, question: HitQuestion) -> Dict[str, Any]:
+ def generate_hit_amt_request(self, question: HitQuestion) -> dict[str, Any]:
d = dict()
d["HITTypeId"] = self.amt_hit_type_id
d["MaxAssignments"] = 1
@@ -124,9 +124,9 @@ class Hit(HitTypeCommon):
validate_assignment=True,
)
- id: Optional[PositiveInt] = Field(default=None)
- hit_type_id: Optional[PositiveInt] = Field(default=None)
- question_id: Optional[PositiveInt] = Field(default=None)
+ id: PositiveInt | None = Field(default=None)
+ hit_type_id: PositiveInt | None = Field(default=None)
+ question_id: PositiveInt | None = Field(default=None)
amt_hit_id: AMTBoto3ID = Field()
amt_hit_type_id: AMTBoto3ID = Field()
@@ -138,10 +138,8 @@ class Hit(HitTypeCommon):
# TODO: Check if this is actually ever going to be None. I type fixed it,
# but I don't have anything to suggest it isn't requred. -- Max 2026-02-24
- creation_time: Optional[AwareDatetimeISO] = Field(
- default=None, description="From aws"
- )
- expiration: Optional[AwareDatetimeISO] = Field(default=None)
+ creation_time: AwareDatetimeISO | None = Field(default=None, description="From aws")
+ expiration: AwareDatetimeISO | None = Field(default=None)
# GRL Specific
created_at: AwareDatetimeISO = Field(
@@ -155,7 +153,7 @@ class Hit(HitTypeCommon):
# -- Hit specific
- qualification_requirements: Optional[List[Dict[str, Any]]] = Field(default=None)
+ qualification_requirements: list[dict[str, Any]] | None = Field(default=None)
max_assignments: int = Field()
# # this comes back as expiration. only for the request
@@ -235,7 +233,7 @@ class Hit(HitTypeCommon):
return d
@classmethod
- def from_postgres(cls, data: Dict[str, Any]) -> Self:
+ def from_postgres(cls, data: dict[str, Any]) -> Self:
data["reward"] = USDCent(round(data["reward"] * 100))
return cls.model_validate(data)