annotate clang/utils/analyzer/ProjectMap.py @ 225:f7655407a6ba

remove unnecessary files
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 19 Jul 2021 03:48:36 +0900
parents 2e18cbf3894f
children 1f2b6ac9f198
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 import json
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 import os
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
3
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 from enum import auto, Enum
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 from typing import Any, Dict, List, NamedTuple, Optional, Tuple
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
6
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
7
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 JSON = Dict[str, Any]
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
9
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
10
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 DEFAULT_MAP_FILE = "projects.json"
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
12
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
13
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 class DownloadType(str, Enum):
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 GIT = "git"
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
16 ZIP = "zip"
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 SCRIPT = "script"
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
18
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
19
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
20 class Size(int, Enum):
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
21 """
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
22 Size of the project.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
23
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
24 Sizes do not directly correspond to the number of lines or files in the
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
25 project. The key factor that is important for the developers of the
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 analyzer is the time it takes to analyze the project. Here is how
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
27 the following sizes map to times:
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
28
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
29 TINY: <1min
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
30 SMALL: 1min-10min
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
31 BIG: 10min-1h
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
32 HUGE: >1h
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
33
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
34 The borders are a bit of a blur, especially because analysis time varies
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
35 from one machine to another. However, the relative times will stay pretty
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
36 similar, and these groupings will still be helpful.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
37
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
38 UNSPECIFIED is a very special case, which is intentionally last in the list
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
39 of possible sizes. If the user wants to filter projects by one of the
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
40 possible sizes, we want projects with UNSPECIFIED size to be filtered out
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
41 for any given size.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
42 """
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
43 TINY = auto()
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
44 SMALL = auto()
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
45 BIG = auto()
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
46 HUGE = auto()
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
47 UNSPECIFIED = auto()
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
48
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
49 @staticmethod
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
50 def from_str(raw_size: Optional[str]) -> "Size":
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
51 """
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
52 Construct a Size object from an optional string.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
53
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
54 :param raw_size: optional string representation of the desired Size
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
55 object. None will produce UNSPECIFIED size.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
56
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
57 This method is case-insensitive, so raw sizes 'tiny', 'TINY', and
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
58 'TiNy' will produce the same result.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
59 """
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
60 if raw_size is None:
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
61 return Size.UNSPECIFIED
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
62
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
63 raw_size_upper = raw_size.upper()
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
64 # The implementation is decoupled from the actual values of the enum,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
65 # so we can easily add or modify it without bothering about this
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
66 # function.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
67 for possible_size in Size:
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
68 if possible_size.name == raw_size_upper:
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
69 return possible_size
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
70
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
71 possible_sizes = [size.name.lower() for size in Size
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
72 # no need in showing our users this size
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
73 if size != Size.UNSPECIFIED]
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
74 raise ValueError(f"Incorrect project size '{raw_size}'. "
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
75 f"Available sizes are {possible_sizes}")
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
76
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
77
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
78 class ProjectInfo(NamedTuple):
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
79 """
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
80 Information about a project to analyze.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
81 """
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
82 name: str
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
83 mode: int
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
84 source: DownloadType = DownloadType.SCRIPT
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
85 origin: str = ""
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
86 commit: str = ""
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
87 enabled: bool = True
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
88 size: Size = Size.UNSPECIFIED
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
89
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
90 def with_fields(self, **kwargs) -> "ProjectInfo":
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
91 """
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
92 Create a copy of this project info with customized fields.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
93 NamedTuple is immutable and this is a way to create modified copies.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
94
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
95 info.enabled = True
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
96 info.mode = 1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
97
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
98 can be done as follows:
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
99
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
100 modified = info.with_fields(enbled=True, mode=1)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
101 """
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
102 return ProjectInfo(**{**self._asdict(), **kwargs})
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
103
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
104
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
105 class ProjectMap:
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
106 """
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
107 Project map stores info about all the "registered" projects.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
108 """
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
109 def __init__(self, path: Optional[str] = None, should_exist: bool = True):
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
110 """
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
111 :param path: optional path to a project JSON file, when None defaults
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
112 to DEFAULT_MAP_FILE.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
113 :param should_exist: flag to tell if it's an exceptional situation when
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
114 the project file doesn't exist, creates an empty
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
115 project list instead if we are not expecting it to
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
116 exist.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
117 """
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
118 if path is None:
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
119 path = os.path.join(os.path.abspath(os.curdir), DEFAULT_MAP_FILE)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
120
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
121 if not os.path.exists(path):
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
122 if should_exist:
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
123 raise ValueError(
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
124 f"Cannot find the project map file {path}"
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
125 f"\nRunning script for the wrong directory?\n")
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
126 else:
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
127 self._create_empty(path)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
128
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
129 self.path = path
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
130 self._load_projects()
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
131
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
132 def save(self):
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
133 """
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
134 Save project map back to its original file.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
135 """
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
136 self._save(self.projects, self.path)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
137
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
138 def _load_projects(self):
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
139 with open(self.path) as raw_data:
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
140 raw_projects = json.load(raw_data)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
141
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
142 if not isinstance(raw_projects, list):
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
143 raise ValueError(
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
144 "Project map should be a list of JSON objects")
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
145
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
146 self.projects = self._parse(raw_projects)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
147
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
148 @staticmethod
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
149 def _parse(raw_projects: List[JSON]) -> List[ProjectInfo]:
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
150 return [ProjectMap._parse_project(raw_project)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
151 for raw_project in raw_projects]
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
152
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
153 @staticmethod
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
154 def _parse_project(raw_project: JSON) -> ProjectInfo:
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
155 try:
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
156 name: str = raw_project["name"]
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
157 build_mode: int = raw_project["mode"]
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
158 enabled: bool = raw_project.get("enabled", True)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
159 source: DownloadType = raw_project.get("source", "zip")
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
160 size = Size.from_str(raw_project.get("size", None))
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
161
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
162 if source == DownloadType.GIT:
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
163 origin, commit = ProjectMap._get_git_params(raw_project)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
164 else:
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
165 origin, commit = "", ""
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
166
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
167 return ProjectInfo(name, build_mode, source, origin, commit,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
168 enabled, size)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
169
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
170 except KeyError as e:
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
171 raise ValueError(
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
172 f"Project info is required to have a '{e.args[0]}' field")
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
173
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
174 @staticmethod
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
175 def _get_git_params(raw_project: JSON) -> Tuple[str, str]:
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
176 try:
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
177 return raw_project["origin"], raw_project["commit"]
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
178 except KeyError as e:
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
179 raise ValueError(
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
180 f"Profect info is required to have a '{e.args[0]}' field "
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
181 f"if it has a 'git' source")
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
182
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
183 @staticmethod
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
184 def _create_empty(path: str):
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
185 ProjectMap._save([], path)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
186
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
187 @staticmethod
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
188 def _save(projects: List[ProjectInfo], path: str):
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
189 with open(path, "w") as output:
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
190 json.dump(ProjectMap._convert_infos_to_dicts(projects),
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
191 output, indent=2)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
192
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
193 @staticmethod
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
194 def _convert_infos_to_dicts(projects: List[ProjectInfo]) -> List[JSON]:
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
195 return [ProjectMap._convert_info_to_dict(project)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
196 for project in projects]
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
197
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
198 @staticmethod
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
199 def _convert_info_to_dict(project: ProjectInfo) -> JSON:
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
200 whole_dict = project._asdict()
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
201 defaults = project._field_defaults
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
202
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
203 # there is no need in serializing fields with default values
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
204 for field, default_value in defaults.items():
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
205 if whole_dict[field] == default_value:
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
206 del whole_dict[field]
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
208 return whole_dict