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
genmypy.stub_element.FunctionElement.params
params
Definition: stub_element.py:171
genmypy.stub_element.StatementElementBase.generate
def generate(self, indent)
Definition: stub_element.py:39
genmypy.stub_element.ClassMethodElement.__init__
def __init__(self, name, return_type, params=None)
Definition: stub_element.py:205
genmypy.stub_element.EmptyLinesElement.lines
lines
Definition: stub_element.py:101
genmypy.stub_element._indent
def _indent(depth)
Definition: stub_element.py:12
genmypy.stub_element.ParameterElement.has_default
has_default
Definition: stub_element.py:219
genmypy.stub_element.CommentElement.generate
def generate(self, indent)
Definition: stub_element.py:115
genmypy.stub_element.AliasElement.__init__
def __init__(self, name, alias)
Definition: stub_element.py:156
genmypy.stub_element._generate_imports
def _generate_imports(items, indent)
Definition: stub_element.py:44
genmypy.stub_element.ImportsElement._third_party_modules
_third_party_modules
Definition: stub_element.py:68
genmypy.stub_element.ParameterElement.__init__
def __init__(self, name, type, has_default=False)
Definition: stub_element.py:215
genmypy.stub_element.ClassElement.name
name
Definition: stub_element.py:124
genmypy.stub_element.EmptyLinesElement.generate
def generate(self, indent)
Definition: stub_element.py:103
genmypy.stub_element.AliasElement.generate
def generate(self, indent)
Definition: stub_element.py:161
genmypy.stub_element.AliasElement.alias
alias
Definition: stub_element.py:159
genmypy.stub_element.ImportsElement.__init__
def __init__(self)
Definition: stub_element.py:63
genmypy.stub_element.ModuleElement.generate
def generate(self)
Definition: stub_element.py:31
genmypy.stub_element._format
def _format(content, depth)
Definition: stub_element.py:17
genmypy.stub_element.ParameterElement.name
name
Definition: stub_element.py:217
genmypy.stub_element.FieldElement
Definition: stub_element.py:144
genmypy.stub_element.CommentElement.comment
comment
Definition: stub_element.py:113
genmypy.stub_element.ClassElement
Definition: stub_element.py:121
genmypy.stub_element.StatementElementBase
Definition: stub_element.py:38
genmypy.stub_element.CommentElement.__init__
def __init__(self, comment)
Definition: stub_element.py:111
genmypy.stub_element.CommentElement
Definition: stub_element.py:110
genmypy.stub_element.EmptyLinesElement.__init__
def __init__(self, lines=1)
Definition: stub_element.py:99
genmypy.stub_element.FunctionElement.return_type
return_type
Definition: stub_element.py:170
genmypy.stub_element.FunctionElement.name
name
Definition: stub_element.py:169
genmypy.stub_element.FieldElement.__init__
def __init__(self, name, type)
Definition: stub_element.py:145
genmypy.stub_element.FieldElement.name
name
Definition: stub_element.py:147
genmypy.stub_element.ImportsElement.generate
def generate(self, indent)
Definition: stub_element.py:80
genmypy.stub_element.FunctionElement
Definition: stub_element.py:166
genmypy.stub_element.ParameterElement.generate_expression
def generate_expression(self)
Definition: stub_element.py:221
genmypy.stub_element.AliasElement.name
name
Definition: stub_element.py:158
genmypy.stub_element.ParameterElement.type
type
Definition: stub_element.py:218
genmypy.stub_element.FieldElement.type
type
Definition: stub_element.py:148
genmypy.stub_element.FieldElement.generate
def generate(self, indent)
Definition: stub_element.py:150
genmypy.stub_element.AliasElement
Definition: stub_element.py:155
genmypy.stub_element.ClassElement.__init__
def __init__(self, name, base=None)
Definition: stub_element.py:122
genmypy.stub_element.FunctionElement.__init__
def __init__(self, name, return_type, params=None)
Definition: stub_element.py:167
genmypy.stub_element.EmptyLinesElement
Definition: stub_element.py:98
genmypy.stub_element.ImportsElement._system_modules
_system_modules
Definition: stub_element.py:65
genmypy.stub_element.ModuleElement.add_element
def add_element(self, statement)
Definition: stub_element.py:27
genmypy.stub_element.ParameterElement
Definition: stub_element.py:214
genmypy.stub_element.ClassElement.add
def add(self, member)
Definition: stub_element.py:128
genmypy.stub_element.ClassElement.generate
def generate(self, indent)
Definition: stub_element.py:132
genmypy.stub_element.ModuleElement.__init__
def __init__(self)
Definition: stub_element.py:23
genmypy.stub_element.ModuleElement.statements
statements
Definition: stub_element.py:25
genmypy.stub_element.ImportsElement.add_system_module
def add_system_module(self, module, name)
Definition: stub_element.py:72
genmypy.stub_element.ImportsElement
Definition: stub_element.py:62
genmypy.stub_element.ClassMethodElement
Definition: stub_element.py:204
genmypy.stub_element.ImportsElement.add_third_party_module
def add_third_party_module(self, module, name)
Definition: stub_element.py:76
genmypy.stub_element.ModuleElement
Definition: stub_element.py:22
genmypy.stub_element.FunctionElement.add_parameter
def add_parameter(self, param)
Definition: stub_element.py:176
genmypy.stub_element.ClassElement.members
members
Definition: stub_element.py:126
genmypy.stub_element.ClassElement.base
base
Definition: stub_element.py:125
genmypy.stub_element.FunctionElement.generate
def generate(self, indent)
Definition: stub_element.py:180


genmypy
Author(s): Yuki Igarashi, Tamaki Nishino
autogenerated on Mon Apr 10 2023 03:01:12