Skip to content

Commit 50f885f

Browse files
authored
add new api ci check file (#33609)
1 parent 1681a2d commit 50f885f

File tree

3 files changed

+42
-132
lines changed

3 files changed

+42
-132
lines changed

python/paddle/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -501,7 +501,7 @@
501501
'log10',
502502
'concat',
503503
'check_shape',
504-
'trunc'
504+
'trunc',
505505
'digamma',
506506
'standard_normal'
507507
]

python/paddle/vision/datasets/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
from .voc2012 import VOC2012 # noqa: F401
2323

2424
__all__ = [ #noqa
25-
'DatasetFolder'
25+
'DatasetFolder',
2626
'ImageFolder',
2727
'MNIST',
2828
'FashionMNIST',

tools/print_signatures.py

Lines changed: 40 additions & 130 deletions
Original file line numberDiff line numberDiff line change
@@ -62,96 +62,6 @@ def md5(doc):
6262
return md5sum
6363

6464

65-
def get_functools_partial_spec(func):
66-
func_str = func.func.__name__
67-
args = func.args
68-
keywords = func.keywords
69-
return '{}(args={}, keywords={})'.format(func_str, args, keywords)
70-
71-
72-
def format_spec(spec):
73-
args = spec.args
74-
varargs = spec.varargs
75-
keywords = spec.keywords
76-
defaults = spec.defaults
77-
if defaults is not None:
78-
defaults = list(defaults)
79-
for idx, item in enumerate(defaults):
80-
if not isinstance(item, functools.partial):
81-
continue
82-
83-
defaults[idx] = get_functools_partial_spec(item)
84-
85-
defaults = tuple(defaults)
86-
87-
return 'ArgSpec(args={}, varargs={}, keywords={}, defaults={})'.format(
88-
args, varargs, keywords, defaults)
89-
90-
91-
def queue_dict(member, cur_name):
92-
if cur_name != 'paddle':
93-
try:
94-
eval(cur_name)
95-
except (AttributeError, NameError, SyntaxError) as e:
96-
print(
97-
"Error({}) occurred when `eval({})`, discard it.".format(
98-
str(e), cur_name),
99-
file=sys.stderr)
100-
return
101-
102-
if (inspect.isclass(member) or inspect.isfunction(member) or
103-
inspect.ismethod(member)) and hasattr(
104-
member, '__module__') and hasattr(member, '__name__'):
105-
args = member.__module__ + "." + member.__name__
106-
try:
107-
eval(args)
108-
except (AttributeError, NameError, SyntaxError) as e:
109-
print(
110-
"Error({}) occurred when `eval({})`, discard it for {}.".format(
111-
str(e), args, cur_name),
112-
file=sys.stderr)
113-
return
114-
else:
115-
try:
116-
args = inspect.getargspec(member)
117-
has_type_error = False
118-
except TypeError: # special for PyBind method
119-
args = " ".join([
120-
line.strip() for line in pydoc.render_doc(member).split('\n')
121-
if "->" in line
122-
])
123-
has_type_error = True
124-
125-
if not has_type_error:
126-
args = format_spec(args)
127-
128-
doc_md5 = md5(member.__doc__)
129-
member_dict[cur_name] = "({}, ('document', '{}'))".format(args, doc_md5)
130-
131-
132-
def visit_member(parent_name, member, member_name=None):
133-
if member_name:
134-
cur_name = ".".join([parent_name, member_name])
135-
else:
136-
cur_name = ".".join([parent_name, member.__name__])
137-
if inspect.isclass(member):
138-
queue_dict(member, cur_name)
139-
for name, value in inspect.getmembers(member):
140-
if hasattr(value, '__name__') and not name.startswith("_"):
141-
visit_member(cur_name, value)
142-
elif inspect.ismethoddescriptor(member):
143-
return
144-
elif inspect.isbuiltin(member):
145-
return
146-
elif callable(member):
147-
queue_dict(member, cur_name)
148-
elif inspect.isgetsetdescriptor(member):
149-
return
150-
else:
151-
raise RuntimeError("Unsupported generate signature of member, type {0}".
152-
format(str(type(member))))
153-
154-
15565
def is_primitive(instance):
15666
int_types = (int, )
15767
pritimitive_types = int_types + (float, str)
@@ -167,6 +77,13 @@ def is_primitive(instance):
16777
return False
16878

16979

80+
ErrorSet = set()
81+
IdSet = set()
82+
skiplist = [
83+
'paddle.vision.datasets.DatasetFolderImageFolder', 'paddle.truncdigamma'
84+
]
85+
86+
17087
def visit_all_module(mod):
17188
mod_name = mod.__name__
17289
if mod_name != 'paddle' and not mod_name.startswith('paddle.'):
@@ -177,37 +94,36 @@ def visit_all_module(mod):
17794

17895
if mod in visited_modules:
17996
return
180-
18197
visited_modules.add(mod)
98+
99+
member_names = dir(mod)
182100
if hasattr(mod, "__all__"):
183-
member_names = (name for name in mod.__all__
184-
if not name.startswith("_"))
185-
elif mod_name == 'paddle':
186-
member_names = dir(mod)
187-
else:
188-
return
101+
member_names += mod.__all__
189102
for member_name in member_names:
190-
instance = getattr(mod, member_name, None)
191-
if instance is None:
103+
if member_name.startswith('__'):
192104
continue
193-
194-
if is_primitive(instance):
195-
continue
196-
197-
if not hasattr(instance, "__name__"):
198-
continue
199-
200-
if inspect.ismodule(instance):
201-
visit_all_module(instance)
202-
else:
203-
if member_name != instance.__name__:
204-
print(
205-
"Found alias API, alias name is: {}, original name is: {}".
206-
format(member_name, instance.__name__),
207-
file=sys.stderr)
208-
visit_member(mod.__name__, instance, member_name)
105+
cur_name = mod_name + '.' + member_name
106+
try:
107+
instance = getattr(mod, member_name)
108+
if inspect.ismodule(instance):
109+
visit_all_module(instance)
209110
else:
210-
visit_member(mod.__name__, instance)
111+
doc_md5 = md5(instance.__doc__)
112+
instance_id = id(instance)
113+
if instance_id in IdSet:
114+
continue
115+
IdSet.add(instance_id)
116+
member_dict[cur_name] = "({}, ('document', '{}'))".format(
117+
cur_name, doc_md5)
118+
if hasattr(instance,
119+
'__name__') and member_name != instance.__name__:
120+
print(
121+
"Found alias API, alias name is: {}, original name is: {}".
122+
format(member_name, instance.__name__),
123+
file=sys.stderr)
124+
except:
125+
if not cur_name in ErrorSet and not cur_name in skiplist:
126+
ErrorSet.add(cur_name)
211127

212128

213129
# all from gen_doc.py
@@ -306,28 +222,22 @@ def process_module(m, attr="__all__"):
306222

307223

308224
def get_all_api_from_modulelist():
309-
modulelist = [
310-
paddle, paddle.amp, paddle.nn, paddle.nn.functional,
311-
paddle.nn.initializer, paddle.nn.utils, paddle.static, paddle.static.nn,
312-
paddle.io, paddle.jit, paddle.metric, paddle.distribution,
313-
paddle.optimizer, paddle.optimizer.lr, paddle.regularizer, paddle.text,
314-
paddle.utils, paddle.utils.download, paddle.utils.profiler,
315-
paddle.utils.cpp_extension, paddle.sysconfig, paddle.vision,
316-
paddle.distributed, paddle.distributed.fleet,
317-
paddle.distributed.fleet.utils, paddle.distributed.parallel,
318-
paddle.distributed.utils, paddle.callbacks, paddle.hub, paddle.autograd
319-
]
225+
modulelist = [paddle]
320226
for m in modulelist:
321227
visit_all_module(m)
322228

323229
return member_dict
324230

325231

326232
if __name__ == '__main__':
327-
# modules = sys.argv[1].split(",")
328-
# for m in modules:
329-
# visit_all_module(importlib.import_module(m))
330233
get_all_api_from_modulelist()
331234

332235
for name in member_dict:
333236
print(name, member_dict[name])
237+
if len(ErrorSet) == 0:
238+
sys.exit(0)
239+
for erroritem in ErrorSet:
240+
print(
241+
"Error, new function {} is unreachable".format(erroritem),
242+
file=sys.stderr)
243+
sys.exit(1)

0 commit comments

Comments
 (0)