1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171
|
from dataclasses import dataclass, field
from datetime import datetime
from enum import Enum
from typing import Optional
import pyperf
from dataclasses_json import DataClassJsonMixin, config
from benchmark.common import AbstractBenchmark
datetime_config = config(
decoder=datetime.fromisoformat, encoder=datetime.isoformat
)
optional_datetime_config = config(
decoder=lambda o: datetime.fromisoformat(o) if o is not None else None,
encoder=lambda o: o.isoformat() if isinstance(o, datetime) else None,
)
enum_config = config(encoder=lambda o: o.value)
optional_enum_config = config(
encoder=lambda o: o.value if isinstance(o, Enum) else None
)
class IssueState(Enum):
OPEN = "open"
CLOSED = "closed"
class MilestoneState(Enum):
OPEN = "open"
CLOSED = "closed"
class IssueStateReason(Enum):
COMPLETED = "completed"
REOPENED = "reopened"
NOT_PLANNED = "not_planned"
class AuthorAssociation(Enum):
COLLABORATOR = "COLLABORATOR"
CONTRIBUTOR = "CONTRIBUTOR"
FIRST_TIMER = "FIRST_TIMER"
FIRST_TIME_CONTRIBUTOR = "FIRST_TIME_CONTRIBUTOR"
MANNEQUIN = "MANNEQUIN"
MEMBER = "MEMBER"
NONE = "NONE"
OWNER = "OWNER"
@dataclass(slots=True)
class User(DataClassJsonMixin):
login: str
id: int
node_id: str
avatar_url: str
gravatar_id: Optional[str]
url: str
html_url: str
followers_url: str
following_url: str
gists_url: str
starred_url: str
subscriptions_url: str
organizations_url: str
repos_url: str
events_url: str
received_events_url: str
type: str
site_admin: bool
name: Optional[str] = None
email: Optional[str] = None
starred_at: Optional[datetime] = field(
default=None, metadata=optional_datetime_config
)
@dataclass(slots=True)
class IssueLabel(DataClassJsonMixin):
id: int
node_id: str
url: str
name: str
description: Optional[str]
color: Optional[str]
default: bool
@dataclass(slots=True)
class Milestone(DataClassJsonMixin):
url: str
html_url: str
labels_url: str
id: int
node_id: str
number: int
title: str
description: Optional[str]
creator: Optional[User]
open_issues: int
closed_issues: int
created_at: datetime = field(metadata=datetime_config)
updated_at: datetime = field(metadata=datetime_config)
closed_at: Optional[datetime] = field(metadata=optional_datetime_config)
due_on: Optional[datetime] = field(metadata=optional_datetime_config)
state: MilestoneState = MilestoneState.OPEN
@dataclass(slots=True)
class Reactions(DataClassJsonMixin):
url: str
total_count: int
plus_one: int = field(metadata=config(field_name="+1"))
minus_one: int = field(metadata=config(field_name="-1"))
laugh: int
confused: int
heart: int
hooray: int
eyes: int
rocket: int
@dataclass(slots=True)
class Issue(DataClassJsonMixin):
id: int
node_id: str
url: str
repository_url: str
labels_url: str
comments_url: str
events_url: str
html_url: str
number: int
state: IssueState = field(metadata=enum_config)
state_reason: Optional[IssueStateReason] = field(
metadata=optional_enum_config
)
title: str
body: Optional[str]
user: Optional[User]
labels: list[IssueLabel]
assignee: Optional[User]
assignees: Optional[list[User]]
milestone: Optional[Milestone]
locked: bool
active_lock_reason: Optional[str]
comments: int
closed_at: Optional[datetime] = field(metadata=optional_datetime_config)
created_at: datetime = field(metadata=datetime_config)
updated_at: datetime = field(metadata=datetime_config)
closed_by: Optional[User]
author_association: AuthorAssociation = field(metadata=enum_config)
draft: bool = False
body_html: Optional[str] = None
body_text: Optional[str] = None
timeline_url: Optional[str] = None
reactions: Optional[Reactions] = None
class Benchmark(AbstractBenchmark):
LIBRARY = "dataclasses-json"
def warmup(self, data) -> None:
Issue.from_dict(data).to_dict()
def run_loader(self, data) -> pyperf.Benchmark:
return self._bench_loader_func(Issue.from_dict, data)
def run_dumper(self, data) -> pyperf.Benchmark:
obj = Issue.from_dict(data)
return self._bench_dumper_func(obj.to_dict)
|