File: common.py

package info (click to toggle)
python-mashumaro 3.17-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,408 kB
  • sloc: python: 19,981; sh: 16; makefile: 5
file content (171 lines) | stat: -rw-r--r-- 4,396 bytes parent folder | download | duplicates (2)
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)