stub_element.py
Go to the documentation of this file.
1 import collections
2 
3 from ._typing import TYPE_CHECKING
4 
5 if TYPE_CHECKING:
6  from typing import DefaultDict, Iterator, List, Optional, Sequence, Set, Tuple
7 
8 INDENT_SIZE = 4
9 FUNCTION_PARAM_MULTILINE_THRESHOLD = 70
10 
11 
12 def _indent(depth):
13  # type: (int) -> str
14  return " " * INDENT_SIZE * depth
15 
16 
17 def _format(content, depth):
18  # type: (str, int) -> str
19  return "{}{}".format(_indent(depth), content)
20 
21 
23  def __init__(self):
24  # type: () -> None
25  self.statements = [] # type: List[StatementElementBase]
26 
27  def add_element(self, statement):
28  # type: (StatementElementBase) -> None
29  self.statements.append(statement)
30 
31  def generate(self):
32  # type: () -> Iterator[str]
33  for statement in self.statements:
34  for line in statement.generate(0):
35  yield line
36 
37 
38 class StatementElementBase(object):
39  def generate(self, indent):
40  # type: (int) -> Iterator[str]
41  raise NotImplementedError()
42 
43 
44 def _generate_imports(items, indent):
45  # type: (DefaultDict[str, Set[Optional[str]]], int) -> Tuple[List[str], List[str]]
46  imports = [] # type: List[str]
47  from_imports = [] # type: List[str]
48  for module, elements in sorted(items.items()):
49  if None in elements:
50  imports.append(_format("import {}".format(module), indent))
51 
52  names = [e for e in elements if e is not None]
53  if len(names) == 0:
54  continue
55 
56  joined = ", ".join(sorted(names))
57  from_imports.append(_format("from {} import {}".format(module, joined), indent))
58 
59  return imports, from_imports
60 
61 
63  def __init__(self):
64  # type: () -> None
65  self._system_modules = collections.defaultdict(
66  set
67  ) # type: DefaultDict[str, Set[Optional[str]]]
68  self._third_party_modules = collections.defaultdict(
69  set
70  ) # type: DefaultDict[str, Set[Optional[str]]]
71 
72  def add_system_module(self, module, name):
73  # type: (str, Optional[str]) -> None
74  self._system_modules[module].add(name)
75 
76  def add_third_party_module(self, module, name):
77  # type: (str, Optional[str]) -> None
78  self._third_party_modules[module].add(name)
79 
80  def generate(self, indent):
81  # type: (int) -> Iterator[str]
82  imports, from_imports = _generate_imports(self._system_modules, indent)
83  for line in imports:
84  yield line
85  for line in from_imports:
86  yield line
87 
88  if len(self._system_modules) > 0:
89  yield ""
90 
91  imports, from_imports = _generate_imports(self._third_party_modules, indent)
92  for line in imports:
93  yield line
94  for line in from_imports:
95  yield line
96 
97 
99  def __init__(self, lines=1):
100  # type: (int) -> None
101  self.lines = lines
102 
103  def generate(self, indent):
104  # type: (int) -> Iterator[str]
105  # NOTE: Do not use _format(...) for empty lines
106  for _ in range(self.lines):
107  yield ""
108 
109 
111  def __init__(self, comment):
112  # type: (str) -> None
113  self.comment = comment
114 
115  def generate(self, indent):
116  # type: (int) -> Iterator[str]
117  for line in self.comment.splitlines():
118  yield _format("# {}".format(line), indent)
119 
120 
122  def __init__(self, name, base=None):
123  # type: (str, Optional[str]) -> None
124  self.name = name
125  self.base = base
126  self.members = [] # type: List[StatementElementBase]
127 
128  def add(self, member):
129  # type: (StatementElementBase) -> None
130  self.members.append(member)
131 
132  def generate(self, indent):
133  # type: (int) -> Iterator[str]
134  if self.base is not None:
135  yield _format("class {}({}):".format(self.name, self.base), indent)
136  else:
137  yield _format("class {}:".format(self.name), indent)
138 
139  for m in self.members:
140  for line in m.generate(indent + 1):
141  yield line
142 
143 
145  def __init__(self, name, type):
146  # type: (str, str) -> None
147  self.name = name
148  self.type = type
149 
150  def generate(self, indent):
151  # type: (int) -> Iterator[str]
152  yield _format("{}: {}".format(self.name, self.type), indent)
153 
154 
156  def __init__(self, name, alias):
157  # type: (str, str) -> None
158  self.name = name
159  self.alias = alias
160 
161  def generate(self, indent):
162  # type: (int) -> Iterator[str]
163  yield _format("{} = {}".format(self.name, self.alias), indent)
164 
165 
167  def __init__(self, name, return_type, params=None):
168  # type: (str, str, Optional[Sequence[ParameterElement]]) -> None
169  self.name = name
170  self.return_type = return_type
171  self.params = [] # type: List[ParameterElement]
172 
173  if params is not None:
174  self.params.extend(params)
175 
176  def add_parameter(self, param):
177  # type: (ParameterElement) -> None
178  self.params.append(param)
179 
180  def generate(self, indent):
181  # type: (int) -> Iterator[str]
182  param_expression = ""
183 
184  params = [p.generate_expression() for p in self.params]
185  total_length = sum(len(e) for e in params)
186  if total_length > FUNCTION_PARAM_MULTILINE_THRESHOLD:
187  param_defs = ",\n".join(_format(p, indent + 1) for p in params)
188  param_expression = "\n{},\n{}".format(param_defs, _format("", indent))
189  else:
190  param_expression = ", ".join(params)
191 
192  generated = _format(
193  "def {}({}) -> {}: ...".format(
194  self.name,
195  param_expression,
196  self.return_type,
197  ),
198  indent,
199  )
200  for line in generated.splitlines():
201  yield line
202 
203 
205  def __init__(self, name, return_type, params=None):
206  # type: (str, str, Optional[Sequence[ParameterElement]]) -> None
207  super(ClassMethodElement, self).__init__(name, return_type)
208  self.add_parameter(ParameterElement("self", None))
209  if params is not None:
210  for p in params:
211  self.add_parameter(p)
212 
213 
215  def __init__(self, name, type, has_default=False):
216  # type: (str, Optional[str], bool) -> None
217  self.name = name
218  self.type = type
219  self.has_default = has_default
220 
222  # type: () -> str
223  ret = str(self.name)
224  if self.type is not None:
225  ret = "{}: {}".format(ret, self.type)
226 
227  if self.has_default:
228  ret = "{} = ...".format(ret)
229 
230  return ret
def __init__(self, name, return_type, params=None)
def _generate_imports(items, indent)
Definition: stub_element.py:44
def add_element(self, statement)
Definition: stub_element.py:27
def __init__(self, name, base=None)
def _format(content, depth)
Definition: stub_element.py:17
def __init__(self, name, alias)
def __init__(self, name, type, has_default=False)
def __init__(self, name, type)
def __init__(self, name, return_type, params=None)
def add_system_module(self, module, name)
Definition: stub_element.py:72
def add_third_party_module(self, module, name)
Definition: stub_element.py:76


genmypy
Author(s): Yuki Igarashi, Tamaki Nishino
autogenerated on Mon Apr 10 2023 02:40:49