py2docfx 0.1.1.dev1621288__py3-none-any.whl → 0.1.1.dev1621518__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- py2docfx/docfx_yaml/build_finished.py +92 -142
- py2docfx/docfx_yaml/common.py +1 -5
- py2docfx/docfx_yaml/parameter_utils.py +1 -1
- py2docfx/docfx_yaml/process_doctree.py +20 -88
- py2docfx/docfx_yaml/translator.py +2 -10
- {py2docfx-0.1.1.dev1621288.dist-info → py2docfx-0.1.1.dev1621518.dist-info}/METADATA +1 -1
- {py2docfx-0.1.1.dev1621288.dist-info → py2docfx-0.1.1.dev1621518.dist-info}/RECORD +9 -15
- py2docfx/docfx_yaml/tests/roots/test-build-finished/code_with_signature_and_docstring.py +0 -16
- py2docfx/docfx_yaml/tests/roots/test-build-finished/conf.py +0 -24
- py2docfx/docfx_yaml/tests/roots/test-method-arguments/code_with_all_arg_types.py +0 -10
- py2docfx/docfx_yaml/tests/roots/test-method-arguments/conf.py +0 -24
- py2docfx/docfx_yaml/tests/test_build_finished.py +0 -33
- py2docfx/docfx_yaml/tests/test_method_arguments.py +0 -35
- {py2docfx-0.1.1.dev1621288.dist-info → py2docfx-0.1.1.dev1621518.dist-info}/WHEEL +0 -0
- {py2docfx-0.1.1.dev1621288.dist-info → py2docfx-0.1.1.dev1621518.dist-info}/top_level.txt +0 -0
@@ -93,146 +93,8 @@ def build_finished(app, exception):
|
|
93
93
|
app.builder.outdir, # Output Directory for Builder
|
94
94
|
API_ROOT
|
95
95
|
))
|
96
|
-
|
97
|
-
def add_isrequired_if_needed(obj, key: str):
|
98
|
-
if key in obj['syntax'] and obj['type'] in ['class', 'function', 'method']:
|
99
|
-
for args in obj['syntax'][key]:
|
100
|
-
if 'isRequired' not in args and 'defaultValue' not in args:
|
101
|
-
args['isRequired'] = True
|
102
|
-
|
103
|
-
|
104
96
|
ensuredir(normalized_outdir)
|
105
97
|
|
106
|
-
def filter_out_self_from_args(obj):
|
107
|
-
arg_params = obj.get('syntax', {}).get('parameters', [])
|
108
|
-
if(len(arg_params) > 0 and 'id' in arg_params[0]):
|
109
|
-
if (arg_params[0]['id'] == 'self') or (obj['type'] in ['class', 'method'] and arg_params[0]['id'] == 'cls'):
|
110
|
-
# Support having `self` as an arg param, but not documented
|
111
|
-
# Not document 'cls' of constuctors and class methods too
|
112
|
-
arg_params = arg_params[1:]
|
113
|
-
obj['syntax']['parameters'] = arg_params
|
114
|
-
return obj
|
115
|
-
|
116
|
-
def get_merged_params(obj, info_field_data, arg_params):
|
117
|
-
merged_params = []
|
118
|
-
if 'parameters' in info_field_data[obj['uid']]:
|
119
|
-
doc_params = info_field_data[obj['uid']].get(
|
120
|
-
'parameters', [])
|
121
|
-
if arg_params and doc_params:
|
122
|
-
if len(arg_params) - len(doc_params) > 0:
|
123
|
-
print("Documented params don't match size of params:"" {}".format(obj['uid'])) # lgtm [py/clear-text-logging-sensitive-data]
|
124
|
-
doc_params = remove_params_without_id(doc_params)
|
125
|
-
merged_params = merge_params(arg_params, doc_params)
|
126
|
-
else:
|
127
|
-
merged_params = arg_params
|
128
|
-
|
129
|
-
return merged_params
|
130
|
-
|
131
|
-
def get_merged_kwargs(obj, info_field_data):
|
132
|
-
merged_kwargs = []
|
133
|
-
if 'keywordOnlyArguments' in info_field_data[obj['uid']]:
|
134
|
-
kwargs_from_inspect = obj.get('syntax', {}).get('keywordOnlyArguments', [])
|
135
|
-
kwargs_from_doc = info_field_data[obj['uid']].get('keywordOnlyArguments', [])
|
136
|
-
if kwargs_from_inspect and kwargs_from_doc:
|
137
|
-
merged_kwargs = merge_params(kwargs_from_inspect, kwargs_from_doc)
|
138
|
-
|
139
|
-
return merged_kwargs
|
140
|
-
|
141
|
-
def raise_up_fields(obj):
|
142
|
-
# Raise up summary
|
143
|
-
if 'summary' in obj['syntax'] and obj['syntax']['summary']:
|
144
|
-
obj['summary'] = obj['syntax'].pop(
|
145
|
-
'summary').strip(" \n\r\r")
|
146
|
-
|
147
|
-
# Raise up remarks
|
148
|
-
if 'remarks' in obj['syntax'] and obj['syntax']['remarks']:
|
149
|
-
obj['remarks'] = obj['syntax'].pop('remarks')
|
150
|
-
|
151
|
-
# Raise up seealso
|
152
|
-
if 'seealso' in obj['syntax'] and obj['syntax']['seealso']:
|
153
|
-
obj['seealsoContent'] = obj['syntax'].pop('seealso')
|
154
|
-
|
155
|
-
# Raise up example
|
156
|
-
if 'example' in obj['syntax'] and obj['syntax']['example']:
|
157
|
-
obj.setdefault('example', []).append(
|
158
|
-
obj['syntax'].pop('example'))
|
159
|
-
|
160
|
-
# Raise up exceptions
|
161
|
-
if 'exceptions' in obj['syntax'] and obj['syntax']['exceptions']:
|
162
|
-
obj['exceptions'] = obj['syntax'].pop('exceptions')
|
163
|
-
|
164
|
-
# Raise up references
|
165
|
-
if 'references' in obj['syntax'] and obj['syntax']['references']:
|
166
|
-
obj.setdefault('references', []).extend(
|
167
|
-
obj['syntax'].pop('references'))
|
168
|
-
|
169
|
-
return obj
|
170
|
-
|
171
|
-
def merge_data(obj, info_field_data, yaml_data):
|
172
|
-
# Avoid entities with same uid and diff type.
|
173
|
-
# Delete `type` temporarily
|
174
|
-
del(info_field_data[obj['uid']]['type'])
|
175
|
-
if 'syntax' not in obj:
|
176
|
-
obj['syntax'] = {}
|
177
|
-
arg_params = obj.get('syntax', {}).get('parameters', [])
|
178
|
-
merged_params = get_merged_params(obj, info_field_data, arg_params)
|
179
|
-
merged_kwargs = get_merged_kwargs(obj, info_field_data)
|
180
|
-
|
181
|
-
obj['syntax'].update(info_field_data[obj['uid']])
|
182
|
-
|
183
|
-
# Merging parameters and keywordOnlyArguments is required,
|
184
|
-
# becasue parameters and keywordOnlyArguments can be in both signature and docstring
|
185
|
-
# For positionalOnlyArguments, it's not required, because it's only in signature so far
|
186
|
-
if merged_params:
|
187
|
-
obj['syntax']['parameters'] = merged_params
|
188
|
-
if merged_kwargs:
|
189
|
-
obj['syntax']['keywordOnlyArguments'] = merged_kwargs
|
190
|
-
|
191
|
-
add_isrequired_if_needed(obj, 'parameters')
|
192
|
-
add_isrequired_if_needed(obj, 'keywordOnlyArguments')
|
193
|
-
add_isrequired_if_needed(obj, 'positionalOnlyArguments')
|
194
|
-
|
195
|
-
obj = raise_up_fields(obj)
|
196
|
-
|
197
|
-
# add content of temp list 'added_attribute' to children and yaml_data
|
198
|
-
if 'added_attribute' in obj['syntax'] and obj['syntax']['added_attribute']:
|
199
|
-
added_attribute = obj['syntax'].pop('added_attribute')
|
200
|
-
# TODO: yaml_data is updated wihle iterated.
|
201
|
-
# `added_attribute` items are copied from class api's `obj` to `yaml_data`
|
202
|
-
# Then iterate again
|
203
|
-
# Should iterate uid and merge yaml_data, added_attribute
|
204
|
-
for attrData in added_attribute:
|
205
|
-
existed_Data = next(
|
206
|
-
(n for n in yaml_data if n['uid'] == attrData['uid']), None)
|
207
|
-
if existed_Data:
|
208
|
-
# Update data for already existed one which has attribute comment in source file
|
209
|
-
existed_Data.update(attrData)
|
210
|
-
else:
|
211
|
-
obj.get('children', []).append(attrData['uid'])
|
212
|
-
yaml_data.append(attrData)
|
213
|
-
# Revert `type` for other objects to use
|
214
|
-
info_field_data[obj['uid']]['type'] = obj['type']
|
215
|
-
|
216
|
-
return obj, info_field_data, yaml_data
|
217
|
-
|
218
|
-
def build_nested_toc(toc_yaml, uid):
|
219
|
-
# Build nested TOC
|
220
|
-
if uid.count('.') >= 1:
|
221
|
-
parent_level = '.'.join(uid.split('.')[:-1])
|
222
|
-
found_node = find_node_in_toc_tree(toc_yaml, parent_level)
|
223
|
-
|
224
|
-
if found_node:
|
225
|
-
found_node.pop('uid', 'No uid found')
|
226
|
-
found_node.setdefault('items', [{'name': 'Overview', 'uid': parent_level}]).append(
|
227
|
-
{'name': uid, 'uid': uid})
|
228
|
-
else:
|
229
|
-
toc_yaml.append({'name': uid, 'uid': uid})
|
230
|
-
|
231
|
-
else:
|
232
|
-
toc_yaml.append({'name': uid, 'uid': uid})
|
233
|
-
|
234
|
-
return toc_yaml
|
235
|
-
|
236
98
|
toc_yaml = []
|
237
99
|
# Used to record filenames dumped to avoid confliction
|
238
100
|
# caused by Windows case insensitive file system
|
@@ -254,11 +116,86 @@ def build_finished(app, exception):
|
|
254
116
|
references = []
|
255
117
|
# Merge module data with class data
|
256
118
|
for obj in yaml_data:
|
257
|
-
|
258
|
-
|
119
|
+
arg_params = obj.get('syntax', {}).get('parameters', [])
|
120
|
+
if(len(arg_params) > 0 and 'id' in arg_params[0]):
|
121
|
+
if (arg_params[0]['id'] == 'self') or (obj['type'] in ['class', 'method'] and arg_params[0]['id'] == 'cls'):
|
122
|
+
# Support having `self` as an arg param, but not documented
|
123
|
+
# Not document 'cls' of constuctors and class methods too
|
124
|
+
arg_params = arg_params[1:]
|
125
|
+
obj['syntax']['parameters'] = arg_params
|
259
126
|
if obj['uid'] in app.env.docfx_info_field_data and \
|
260
127
|
obj['type'] == app.env.docfx_info_field_data[obj['uid']]['type']:
|
261
|
-
|
128
|
+
# Avoid entities with same uid and diff type.
|
129
|
+
# Delete `type` temporarily
|
130
|
+
del(app.env.docfx_info_field_data[obj['uid']]['type'])
|
131
|
+
if 'syntax' not in obj:
|
132
|
+
obj['syntax'] = {}
|
133
|
+
merged_params = []
|
134
|
+
if 'parameters' in app.env.docfx_info_field_data[obj['uid']]:
|
135
|
+
doc_params = app.env.docfx_info_field_data[obj['uid']].get(
|
136
|
+
'parameters', [])
|
137
|
+
if arg_params and doc_params:
|
138
|
+
if len(arg_params) - len(doc_params) > 0:
|
139
|
+
print("Documented params don't match size of params:"" {}".format(obj['uid'])) # lgtm [py/clear-text-logging-sensitive-data]
|
140
|
+
doc_params = remove_params_without_id(doc_params)
|
141
|
+
merged_params = merge_params(arg_params, doc_params)
|
142
|
+
|
143
|
+
obj['syntax'].update(
|
144
|
+
app.env.docfx_info_field_data[obj['uid']])
|
145
|
+
if merged_params:
|
146
|
+
obj['syntax']['parameters'] = merged_params
|
147
|
+
|
148
|
+
if 'parameters' in obj['syntax'] and obj['type'] == 'method':
|
149
|
+
for args in obj['syntax']['parameters']:
|
150
|
+
if 'isRequired' not in args and 'defaultValue' not in args:
|
151
|
+
args['isRequired'] = True
|
152
|
+
|
153
|
+
# Raise up summary
|
154
|
+
if 'summary' in obj['syntax'] and obj['syntax']['summary']:
|
155
|
+
obj['summary'] = obj['syntax'].pop(
|
156
|
+
'summary').strip(" \n\r\r")
|
157
|
+
|
158
|
+
# Raise up remarks
|
159
|
+
if 'remarks' in obj['syntax'] and obj['syntax']['remarks']:
|
160
|
+
obj['remarks'] = obj['syntax'].pop('remarks')
|
161
|
+
|
162
|
+
# Raise up seealso
|
163
|
+
if 'seealso' in obj['syntax'] and obj['syntax']['seealso']:
|
164
|
+
obj['seealsoContent'] = obj['syntax'].pop('seealso')
|
165
|
+
|
166
|
+
# Raise up example
|
167
|
+
if 'example' in obj['syntax'] and obj['syntax']['example']:
|
168
|
+
obj.setdefault('example', []).append(
|
169
|
+
obj['syntax'].pop('example'))
|
170
|
+
|
171
|
+
# Raise up exceptions
|
172
|
+
if 'exceptions' in obj['syntax'] and obj['syntax']['exceptions']:
|
173
|
+
obj['exceptions'] = obj['syntax'].pop('exceptions')
|
174
|
+
|
175
|
+
# Raise up references
|
176
|
+
if 'references' in obj['syntax'] and obj['syntax']['references']:
|
177
|
+
obj.setdefault('references', []).extend(
|
178
|
+
obj['syntax'].pop('references'))
|
179
|
+
|
180
|
+
# add content of temp list 'added_attribute' to children and yaml_data
|
181
|
+
if 'added_attribute' in obj['syntax'] and obj['syntax']['added_attribute']:
|
182
|
+
added_attribute = obj['syntax'].pop('added_attribute')
|
183
|
+
# TODO: yaml_data is updated wihle iterated.
|
184
|
+
# `added_attribute` items are copied from class api's `obj` to `yaml_data`
|
185
|
+
# Then iterate again
|
186
|
+
# Should iterate uid and merge yaml_data, added_attribute
|
187
|
+
for attrData in added_attribute:
|
188
|
+
existed_Data = next(
|
189
|
+
(n for n in yaml_data if n['uid'] == attrData['uid']), None)
|
190
|
+
if existed_Data:
|
191
|
+
# Update data for already existed one which has attribute comment in source file
|
192
|
+
existed_Data.update(attrData)
|
193
|
+
else:
|
194
|
+
obj.get('children', []).append(attrData['uid'])
|
195
|
+
yaml_data.append(attrData)
|
196
|
+
# Revert `type` for other objects to use
|
197
|
+
app.env.docfx_info_field_data[obj['uid']
|
198
|
+
]['type'] = obj['type']
|
262
199
|
|
263
200
|
if 'references' in obj:
|
264
201
|
# Ensure that references have no duplicate ref
|
@@ -275,7 +212,20 @@ def build_finished(app, exception):
|
|
275
212
|
if (obj['type'] == 'class' and obj['inheritance']):
|
276
213
|
convert_class_to_enum_if_needed(obj)
|
277
214
|
|
278
|
-
|
215
|
+
# Build nested TOC
|
216
|
+
if uid.count('.') >= 1:
|
217
|
+
parent_level = '.'.join(uid.split('.')[:-1])
|
218
|
+
found_node = find_node_in_toc_tree(toc_yaml, parent_level)
|
219
|
+
|
220
|
+
if found_node:
|
221
|
+
found_node.pop('uid', 'No uid found')
|
222
|
+
found_node.setdefault('items', [{'name': 'Overview', 'uid': parent_level}]).append(
|
223
|
+
{'name': uid, 'uid': uid})
|
224
|
+
else:
|
225
|
+
toc_yaml.append({'name': uid, 'uid': uid})
|
226
|
+
|
227
|
+
else:
|
228
|
+
toc_yaml.append({'name': uid, 'uid': uid})
|
279
229
|
|
280
230
|
for data_set in (app.env.docfx_yaml_packages,
|
281
231
|
app.env.docfx_yaml_modules,
|
py2docfx/docfx_yaml/common.py
CHANGED
@@ -97,9 +97,7 @@ def convert_member(obj, reference_mapping):
|
|
97
97
|
'name': obj.get('fullName', '').split('.')[-1],
|
98
98
|
'summary': obj.get('summary', None),
|
99
99
|
'signature': obj.get('syntax', {}).get('content', None),
|
100
|
-
'positionalOnlyArguments': list(map(convert_parameter_partial, obj.get('syntax', {}).get('positionalOnlyArguments', []))),
|
101
100
|
'parameters': list(map(convert_parameter_partial, obj.get('syntax', {}).get('parameters', []))),
|
102
|
-
'keywordOnlyArguments': list(map(convert_parameter_partial, obj.get('syntax', {}).get('keywordOnlyArguments', []))),
|
103
101
|
'return': convert_return(obj.get('syntax', {}).get('return', {}), reference_mapping),
|
104
102
|
'exceptions': obj.get('exceptions', None),
|
105
103
|
'examples': obj.get('example', None),
|
@@ -169,9 +167,7 @@ def get_constructor_and_variables(syntax_object, reference_mapping):
|
|
169
167
|
if syntax_object:
|
170
168
|
constructor_object = {
|
171
169
|
'syntax': syntax_object.get('content', None),
|
172
|
-
'
|
173
|
-
'parameters': list(map(convert_parameter_partial, syntax_object.get('parameters', []))),
|
174
|
-
'keywordOnlyArguments': list(map(convert_parameter_partial, syntax_object.get('keywordOnlyArguments', []))),
|
170
|
+
'parameters': list(map(convert_parameter_partial, syntax_object.get('parameters', [])))
|
175
171
|
}
|
176
172
|
|
177
173
|
return remove_empty_values(constructor_object), list(map(convert_variable_partial, syntax_object.get('variables', [])))
|
@@ -214,7 +214,7 @@ def extract_description(ret_data, app):
|
|
214
214
|
nodes = ret_data.children
|
215
215
|
description_index = None
|
216
216
|
for node in nodes:
|
217
|
-
if node.tagname == "#text" and node.astext().strip() in ['–', '––'
|
217
|
+
if node.tagname == "#text" and node.astext().strip() in ['–', '––']:
|
218
218
|
description_index = nodes.index(node) + 1
|
219
219
|
break
|
220
220
|
|
@@ -110,72 +110,6 @@ def _resolve_reference_in_module_summary(lines):
|
|
110
110
|
new_lines.append(new_line)
|
111
111
|
return new_lines
|
112
112
|
|
113
|
-
def getParameterArgs(argspec):
|
114
|
-
args = []
|
115
|
-
for arg in argspec.args:
|
116
|
-
args.append({'id': arg})
|
117
|
-
if argspec.defaults:
|
118
|
-
for count, default in enumerate(argspec.defaults):
|
119
|
-
cut_count = len(argspec.defaults)
|
120
|
-
# Only add defaultValue when str(default) doesn't contain object address string
|
121
|
-
# (object at 0x)(lambda at 0x)(function *** at 0x)
|
122
|
-
# inspect.getargspec method will return wrong defaults which contain object address for some default values, like sys.stdout
|
123
|
-
# Match the defaults with the count
|
124
|
-
if ' at 0x' not in str(default):
|
125
|
-
args[len(args) - cut_count +
|
126
|
-
count]['defaultValue'] = str(default)
|
127
|
-
else:
|
128
|
-
args[len(args) - cut_count +
|
129
|
-
count]['isRequired'] = False
|
130
|
-
return args
|
131
|
-
|
132
|
-
def getkeywordOnlyArguments(argspec):
|
133
|
-
keyword_only_args = []
|
134
|
-
# check if there is keyword only args
|
135
|
-
if argspec.kwonlyargs:
|
136
|
-
count = 0
|
137
|
-
for arg in argspec.kwonlyargs:
|
138
|
-
keyword_only_args.append({'id': arg})
|
139
|
-
# try get the default value for keyword only args
|
140
|
-
if argspec.kwonlydefaults:
|
141
|
-
kwarg_default = argspec.kwonlydefaults.get(arg, None)
|
142
|
-
if kwarg_default:
|
143
|
-
keyword_only_args[count]['defaultValue'] = str(kwarg_default)
|
144
|
-
count += 1
|
145
|
-
return keyword_only_args
|
146
|
-
|
147
|
-
def getpositionalOnlyArguments(signature):
|
148
|
-
positional_only_args = []
|
149
|
-
# check if there is positional only args
|
150
|
-
positional_only_arg_list = [param
|
151
|
-
for param in signature.parameters.values()
|
152
|
-
if param.kind == param.POSITIONAL_ONLY]
|
153
|
-
if positional_only_arg_list:
|
154
|
-
count = 0
|
155
|
-
for po_arg in positional_only_arg_list:
|
156
|
-
if po_arg.name != 'self':
|
157
|
-
positional_only_args.append({'id': po_arg.name})
|
158
|
-
|
159
|
-
try:
|
160
|
-
default_value = str(po_arg.default)
|
161
|
-
except KeyError:
|
162
|
-
# if the default value is not available, set it to inspect._empty
|
163
|
-
default_value = "<class 'inspect._empty'>"
|
164
|
-
|
165
|
-
if default_value != "<class 'inspect._empty'>":
|
166
|
-
positional_only_args[count]['defaultValue'] = default_value
|
167
|
-
|
168
|
-
count += 1
|
169
|
-
return positional_only_args
|
170
|
-
|
171
|
-
def removePositonalOnlyArgsFromArgs(args, positional_only_args):
|
172
|
-
# Create a set of ids from positional_only_args for efficient lookup
|
173
|
-
positional_only_args_ids = set(obj['id'] for obj in positional_only_args)
|
174
|
-
|
175
|
-
# Filter out objects from args array whose id is in the set of positional_only_args_ids
|
176
|
-
filtered_a = [obj for obj in args if obj['id'] not in positional_only_args_ids]
|
177
|
-
|
178
|
-
return filtered_a
|
179
113
|
|
180
114
|
def _create_datam(app, cls, module, name, _type, obj, lines=None):
|
181
115
|
"""
|
@@ -186,23 +120,26 @@ def _create_datam(app, cls, module, name, _type, obj, lines=None):
|
|
186
120
|
lines = []
|
187
121
|
short_name = name.split('.')[-1]
|
188
122
|
args = []
|
189
|
-
|
190
|
-
positional_only_args = []
|
123
|
+
|
191
124
|
try:
|
192
125
|
if _type in [CLASS, METHOD, FUNCTION]:
|
193
|
-
if not (_type == CLASS and isinstance(type(obj).__call__, type(EnumMeta.__call__))):
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
126
|
+
if not (_type == CLASS and isinstance(type(obj).__call__, type(EnumMeta.__call__))):
|
127
|
+
argspec = inspect.getfullargspec(obj) # noqa
|
128
|
+
for arg in argspec.args:
|
129
|
+
args.append({'id': arg})
|
130
|
+
if argspec.defaults:
|
131
|
+
for count, default in enumerate(argspec.defaults):
|
132
|
+
cut_count = len(argspec.defaults)
|
133
|
+
# Only add defaultValue when str(default) doesn't contain object address string
|
134
|
+
# (object at 0x)(lambda at 0x)(function *** at 0x)
|
135
|
+
# inspect.getargspec method will return wrong defaults which contain object address for some default values, like sys.stdout
|
136
|
+
# Match the defaults with the count
|
137
|
+
if ' at 0x' not in str(default):
|
138
|
+
args[len(args) - cut_count +
|
139
|
+
count]['defaultValue'] = str(default)
|
140
|
+
else:
|
141
|
+
args[len(args) - cut_count +
|
142
|
+
count]['isRequired'] = False
|
206
143
|
except Exception as e:
|
207
144
|
print("Can't get argspec for {}: {}. Exception: {}".format(type(obj), name, e))
|
208
145
|
|
@@ -223,14 +160,9 @@ def _create_datam(app, cls, module, name, _type, obj, lines=None):
|
|
223
160
|
if summary:
|
224
161
|
datam['summary'] = summary.strip(" \n\r\r")
|
225
162
|
|
226
|
-
if args
|
163
|
+
if args:
|
227
164
|
datam['syntax'] = {}
|
228
|
-
|
229
|
-
datam['syntax']['parameters'] = args
|
230
|
-
if keyword_only_args:
|
231
|
-
datam['syntax']['keywordOnlyArguments'] = keyword_only_args
|
232
|
-
if positional_only_args:
|
233
|
-
datam['syntax']['positionalOnlyArguments'] = positional_only_args
|
165
|
+
datam['syntax']['parameters'] = args
|
234
166
|
if cls:
|
235
167
|
datam[CLASS] = cls
|
236
168
|
if _type in [CLASS, MODULE, PACKAGE]:
|
@@ -123,7 +123,6 @@ def translator(app, docname, doctree):
|
|
123
123
|
def _get_full_data(node, module_name):
|
124
124
|
data = {
|
125
125
|
'parameters': [],
|
126
|
-
'keywordOnlyArguments': [],
|
127
126
|
'variables': [],
|
128
127
|
'exceptions': [],
|
129
128
|
'return': {},
|
@@ -166,20 +165,16 @@ def translator(app, docname, doctree):
|
|
166
165
|
if _is_single_paragraph(fieldbody):
|
167
166
|
#_data = parse_parameter(ret_data, fieldtype)
|
168
167
|
_data = parameter_utils.parse_parameter(content[0], fieldtype, app)
|
169
|
-
if fieldtype
|
168
|
+
if fieldtype in ['Parameters', 'Keyword']:
|
170
169
|
data['parameters'].append(_data)
|
171
|
-
elif fieldtype == 'Keyword':
|
172
|
-
data['keywordOnlyArguments'].append(_data)
|
173
170
|
else:
|
174
171
|
_data['id'] = _parse_variable_id(content[0].astext())
|
175
172
|
data['variables'].append(_data)
|
176
173
|
else:
|
177
174
|
for child in content[0]:
|
178
175
|
_data = parameter_utils.parse_parameter(child[0], fieldtype, app)
|
179
|
-
if fieldtype in ['Parameters']:
|
176
|
+
if fieldtype in ['Parameters', 'Keyword']:
|
180
177
|
data['parameters'].append(_data)
|
181
|
-
elif fieldtype == 'Keyword':
|
182
|
-
data['keywordOnlyArguments'].append(_data)
|
183
178
|
else:
|
184
179
|
_data['id'] = _parse_variable_id(child.astext())
|
185
180
|
data['variables'].append(_data)
|
@@ -376,9 +371,6 @@ def translator(app, docname, doctree):
|
|
376
371
|
if 'parameters' in current_data and 'parameters' in field_list_data:
|
377
372
|
current_data['parameters'].extend(field_list_data['parameters'])
|
378
373
|
field_list_data.pop('parameters')
|
379
|
-
if 'keywordOnlyArguments' in current_data and 'keywordOnlyArguments' in field_list_data:
|
380
|
-
current_data['keywordOnlyArguments'].extend(field_list_data['keywordOnlyArguments'])
|
381
|
-
field_list_data.pop('keywordOnlyArguments')
|
382
374
|
if 'variables' in current_data and 'variables' in field_list_data:
|
383
375
|
current_data['variables'].extend(field_list_data['variables'])
|
384
376
|
field_list_data.pop('variables')
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: py2docfx
|
3
|
-
Version: 0.1.1.
|
3
|
+
Version: 0.1.1.dev1621518
|
4
4
|
Summary: A package built based on Sphinx which download source code package and generate yaml files supported by docfx.
|
5
5
|
Author: Microsoft Corporation
|
6
6
|
License: MIT License
|
@@ -52,9 +52,9 @@ py2docfx/convert_prepare/tests/data/subpackage/azure-mgmt-containerservice/azure
|
|
52
52
|
py2docfx/convert_prepare/tests/data/subpackage/azure-mgmt-containerservice/azure/mgmt/containerservice/v2018_03_31/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
53
53
|
py2docfx/convert_prepare/tests/data/subpackage/azure-mgmt-containerservice/azure/mgmt/containerservice/v2018_03_31/models.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
54
54
|
py2docfx/docfx_yaml/__init__.py,sha256=KCEizAXv-SXtrYhvFfLHdBWDhz51AA9uagaeTL-Itpo,100
|
55
|
-
py2docfx/docfx_yaml/build_finished.py,sha256=
|
55
|
+
py2docfx/docfx_yaml/build_finished.py,sha256=jf8--IvekegnTs6Qx9H31TlDNZA6E5yPWaInmHH9QbA,13996
|
56
56
|
py2docfx/docfx_yaml/build_init.py,sha256=lAw-fnBVQbySfZ7Sut_NpFQUjnqLOmnGQrTBBH2RXcg,1860
|
57
|
-
py2docfx/docfx_yaml/common.py,sha256=
|
57
|
+
py2docfx/docfx_yaml/common.py,sha256=Tl6OPSIcvPjFw1AvWt5Mun8pQr9NtUGQnk4zh474Py0,6316
|
58
58
|
py2docfx/docfx_yaml/convert_class.py,sha256=boKDaxnXbnLxja62UFXi3eChGDB_WBW6ouUUJgOhdpE,2098
|
59
59
|
py2docfx/docfx_yaml/convert_enum.py,sha256=Kyx48WRl-48O7uv4s-Np1oD9uAd3AXL5uHb7jUsnfFg,2022
|
60
60
|
py2docfx/docfx_yaml/convert_module.py,sha256=8UVjPn4krVfu7CgETAEBesYZyLdPthVXg7MXknni6aQ,2088
|
@@ -62,18 +62,16 @@ py2docfx/docfx_yaml/convert_package.py,sha256=R8dTHQXjoztHQ3bkBBchPx0k179IVr_e71
|
|
62
62
|
py2docfx/docfx_yaml/directives.py,sha256=zVVuNM_6AU9G6sbqL1UAyHHgPe7bkBWbthXI-PO5ez0,879
|
63
63
|
py2docfx/docfx_yaml/miss_reference.py,sha256=Btoj9wAvA4u_wU7JHH0Cei3910N8a7MS34OUqJvXAd4,2443
|
64
64
|
py2docfx/docfx_yaml/nodes.py,sha256=tBDi35jLJArlobl07DKOkmH2qz7dudXLp_kTUfR_r2w,412
|
65
|
-
py2docfx/docfx_yaml/parameter_utils.py,sha256=
|
66
|
-
py2docfx/docfx_yaml/process_doctree.py,sha256=
|
65
|
+
py2docfx/docfx_yaml/parameter_utils.py,sha256=vCol5q2SJd1ymuyJdE_-62Tau9RP7PewQdKSimcfQuo,8700
|
66
|
+
py2docfx/docfx_yaml/process_doctree.py,sha256=iKs1fsyo-1_P3RzpZBzD8G9hcOTGO78esWNZLXvSx2g,14866
|
67
67
|
py2docfx/docfx_yaml/return_type_utils.py,sha256=nmdCUOvwdYk2jF6RqmOvU6gjXmXUTPUeCqyHPdKZNUQ,7483
|
68
68
|
py2docfx/docfx_yaml/settings.py,sha256=JQZNwFebczl-zn8Yk2taAGANRi-Hw8hywtDWxqXXFyQ,373
|
69
|
-
py2docfx/docfx_yaml/translator.py,sha256=
|
69
|
+
py2docfx/docfx_yaml/translator.py,sha256=kJwGiXkiJgK3HPcVNX4qmt2Xwd77_DXS9Vd7LyGCFZo,25366
|
70
70
|
py2docfx/docfx_yaml/utils.py,sha256=m5jC_qP2NKqzUx_z0zgZ-HAmxQdNTpJYKkL_F9vGeII,1555
|
71
71
|
py2docfx/docfx_yaml/writer.py,sha256=0ZqyVGDHa4Cr3NsuOPRf4pGUStl6g6IBxpSgIZeDT9I,34683
|
72
72
|
py2docfx/docfx_yaml/yaml_builder.py,sha256=qSxXVS4iFCc1ZdL5QzLrv8hy3LHIQCrhO4WcTp01vag,2575
|
73
73
|
py2docfx/docfx_yaml/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
74
74
|
py2docfx/docfx_yaml/tests/conftest.py,sha256=CykkZxaDZ-3a1EIQdGBieSmHL9FdyTE2xTJZe9QgKcg,1214
|
75
|
-
py2docfx/docfx_yaml/tests/test_build_finished.py,sha256=QLaAA7EXUWsZRzj0hVh3hGF0q0X6acnnm5DqyzpK-7I,1271
|
76
|
-
py2docfx/docfx_yaml/tests/test_method_arguments.py,sha256=BWqRNmebchH_XHDhSPPUc5Gn-TIJlQ3w_vuavXAziUY,1566
|
77
75
|
py2docfx/docfx_yaml/tests/test_numpy_syntax.py,sha256=ssb3J_-Jzjybhh4eycCA_LkXbGflyZyIUAiTjlEYLiw,863
|
78
76
|
py2docfx/docfx_yaml/tests/test_translator_attributes.py,sha256=qZCsQGffq31k3UzpXkJpycplOXIq9gi2SxY6vu0DTfw,5224
|
79
77
|
py2docfx/docfx_yaml/tests/test_translator_contents.py,sha256=lVCWbBIQk2oPFqsKK9gIb-b5DixutMabWjP7x03oj4s,1746
|
@@ -85,10 +83,6 @@ py2docfx/docfx_yaml/tests/test_translator_rst_returns.py,sha256=BL3nOMMTPzNPJk-P
|
|
85
83
|
py2docfx/docfx_yaml/tests/test_translator_signatures.py,sha256=DM51EOb4UXLkrO1-4cQQQvvX210goAsnxKJH-4A2U2Q,1537
|
86
84
|
py2docfx/docfx_yaml/tests/test_writer_table.py,sha256=UnGYXQ-QVxin_e-HGZAHdg1LSFV0qc480ZNsqPN9OYc,1444
|
87
85
|
py2docfx/docfx_yaml/tests/test_writer_uri.py,sha256=L9eFHZndD6H7nkznJ9Bw0v8xh9IegDlhhGFHBz9EHmM,1745
|
88
|
-
py2docfx/docfx_yaml/tests/roots/test-build-finished/code_with_signature_and_docstring.py,sha256=B7sj5kg924mRCNbRyNOTy_NuI8B8lVa857DCCgSn91Y,447
|
89
|
-
py2docfx/docfx_yaml/tests/roots/test-build-finished/conf.py,sha256=L8vIFmO546PCQks50Gif_uTBwC3cppohXrQaogfyRF8,410
|
90
|
-
py2docfx/docfx_yaml/tests/roots/test-method-arguments/code_with_all_arg_types.py,sha256=o-ijRie5aHcBGWXW8HP92-457IOjnkl8IZAO_xuMn14,320
|
91
|
-
py2docfx/docfx_yaml/tests/roots/test-method-arguments/conf.py,sha256=L8vIFmO546PCQks50Gif_uTBwC3cppohXrQaogfyRF8,410
|
92
86
|
py2docfx/docfx_yaml/tests/roots/test-numpy-syntax/code_with_numpy.py,sha256=-7ZN5VPVQfj0-jwPZW_jkIe78B17j5cbXA4f2ZgQIFc,219
|
93
87
|
py2docfx/docfx_yaml/tests/roots/test-numpy-syntax/conf.py,sha256=SczEhbCZ_zuTYW1ZyrB2VJ4FRh6B-q58SN7ZZ5INCeM,394
|
94
88
|
py2docfx/docfx_yaml/tests/roots/test-translator-attributes/code_with_docstring.py,sha256=5JDlpC9Pm-8Bob2Qvqq58Nudk4n26nhHdOiNULrSXeY,326
|
@@ -118,7 +112,7 @@ py2docfx/docfx_yaml/tests/roots/test-writer-table/conf.py,sha256=avcbnIOV2mlGQwh
|
|
118
112
|
py2docfx/docfx_yaml/tests/roots/test-writer-uri/code_with_uri.py,sha256=bzWTZpY2yf_By2bOSl1GFaY3BsZpkAvwQuGztlcHKkQ,537
|
119
113
|
py2docfx/docfx_yaml/tests/roots/test-writer-uri/conf.py,sha256=avcbnIOV2mlGQwhMQJZC4W6UGRBRhnq1QBxjPWlySxQ,260
|
120
114
|
py2docfx/docfx_yaml/tests/utils/test_utils.py,sha256=d0OYSUQ6NyoZx5mlLdNGGNhiNmmQhjVT4hQ6jY3VE_M,3383
|
121
|
-
py2docfx-0.1.1.
|
122
|
-
py2docfx-0.1.1.
|
123
|
-
py2docfx-0.1.1.
|
124
|
-
py2docfx-0.1.1.
|
115
|
+
py2docfx-0.1.1.dev1621518.dist-info/METADATA,sha256=ZI1UYOi4HcUthiEJQtLgnY9kLvTngJ_uO68Ca0xsy08,601
|
116
|
+
py2docfx-0.1.1.dev1621518.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
|
117
|
+
py2docfx-0.1.1.dev1621518.dist-info/top_level.txt,sha256=5dH2uP81dczt_qQJ38wiZ-gzoVWasfiJALWRSjdbnYU,9
|
118
|
+
py2docfx-0.1.1.dev1621518.dist-info/RECORD,,
|
@@ -1,16 +0,0 @@
|
|
1
|
-
class TestClass:
|
2
|
-
def test_method(self,
|
3
|
-
positional_only_arg,
|
4
|
-
/,
|
5
|
-
parameter,
|
6
|
-
*,
|
7
|
-
keyword_only_arg,
|
8
|
-
**kwargs):
|
9
|
-
"""
|
10
|
-
This is a test method
|
11
|
-
|
12
|
-
:param str parameter: This is a parameter
|
13
|
-
:keyword bool keyword_only_arg: This is a keyword only argument
|
14
|
-
"""
|
15
|
-
pass
|
16
|
-
|
@@ -1,24 +0,0 @@
|
|
1
|
-
import os
|
2
|
-
import sys
|
3
|
-
|
4
|
-
sys.path.insert(0, os.path.abspath('.'))
|
5
|
-
|
6
|
-
extensions = ["sphinx.ext.autodoc","sphinx.ext.napoleon", "yaml_builder"]
|
7
|
-
|
8
|
-
class includeTest:
|
9
|
-
pass
|
10
|
-
|
11
|
-
# The suffix of source filenames.
|
12
|
-
source_suffix = '.rst'
|
13
|
-
|
14
|
-
autodoc_mock_imports = [
|
15
|
-
'dummy'
|
16
|
-
]
|
17
|
-
|
18
|
-
pygments_style = 'sphinx'
|
19
|
-
|
20
|
-
napoleon_use_admonition_for_examples = True
|
21
|
-
|
22
|
-
nitpicky = True
|
23
|
-
|
24
|
-
napoleon_preprocess_types=True
|
@@ -1,24 +0,0 @@
|
|
1
|
-
import os
|
2
|
-
import sys
|
3
|
-
|
4
|
-
sys.path.insert(0, os.path.abspath('.'))
|
5
|
-
|
6
|
-
extensions = ["sphinx.ext.autodoc","sphinx.ext.napoleon", "yaml_builder"]
|
7
|
-
|
8
|
-
class includeTest:
|
9
|
-
pass
|
10
|
-
|
11
|
-
# The suffix of source filenames.
|
12
|
-
source_suffix = '.rst'
|
13
|
-
|
14
|
-
autodoc_mock_imports = [
|
15
|
-
'dummy'
|
16
|
-
]
|
17
|
-
|
18
|
-
pygments_style = 'sphinx'
|
19
|
-
|
20
|
-
napoleon_use_admonition_for_examples = True
|
21
|
-
|
22
|
-
nitpicky = True
|
23
|
-
|
24
|
-
napoleon_preprocess_types=True
|
@@ -1,33 +0,0 @@
|
|
1
|
-
import pytest
|
2
|
-
|
3
|
-
from translator import translator
|
4
|
-
from build_finished import build_finished
|
5
|
-
|
6
|
-
from .utils.test_utils import prepare_app_envs,load_rst_transform_to_doctree
|
7
|
-
|
8
|
-
@pytest.mark.sphinx('yaml', testroot='build-finished')
|
9
|
-
def test_build_finished(app):
|
10
|
-
# Test data definition
|
11
|
-
objectToGenXml = 'code_with_signature_and_docstring.TestClass'
|
12
|
-
objectToGenXmlType = 'class'
|
13
|
-
|
14
|
-
# Arrange
|
15
|
-
prepare_app_envs(app, objectToGenXml)
|
16
|
-
doctree = load_rst_transform_to_doctree(app, objectToGenXmlType, objectToGenXml)
|
17
|
-
|
18
|
-
# Act
|
19
|
-
translator(app, '', doctree)
|
20
|
-
build_finished(app, None)
|
21
|
-
|
22
|
-
# Assert
|
23
|
-
target_node = app.env.docfx_yaml_classes[objectToGenXml][1]['syntax']
|
24
|
-
parameter_node = target_node['parameters'][0]
|
25
|
-
keyword_only_arg_node = target_node['keywordOnlyArguments'][0]
|
26
|
-
positional_only_arg_node = target_node['positionalOnlyArguments'][0]
|
27
|
-
|
28
|
-
assert (parameter_node['id'] == 'parameter')
|
29
|
-
assert (parameter_node['type'] == ['<xref:str>'])
|
30
|
-
assert (keyword_only_arg_node['id'] == 'keyword_only_arg')
|
31
|
-
assert (keyword_only_arg_node['type'] == ['<xref:bool>'])
|
32
|
-
assert (positional_only_arg_node['id'] == 'positional_only_arg')
|
33
|
-
assert (positional_only_arg_node['isRequired'] == True)
|
@@ -1,35 +0,0 @@
|
|
1
|
-
import pytest
|
2
|
-
|
3
|
-
from sphinx.testing import restructuredtext
|
4
|
-
from sphinx.io import SphinxStandaloneReader
|
5
|
-
from sphinx import addnodes
|
6
|
-
from translator import translator
|
7
|
-
|
8
|
-
from .utils.test_utils import prepare_app_envs,prepare_refered_objects,load_rst_transform_to_doctree, do_autodoc
|
9
|
-
@pytest.mark.sphinx('dummy', testroot='method-arguments')
|
10
|
-
def test_method_with_three_type_of_arguments(app):
|
11
|
-
# Test data definition
|
12
|
-
objectToGenXml = 'code_with_all_arg_types.TestClass'
|
13
|
-
objectToGenXmlType = 'class'
|
14
|
-
|
15
|
-
# Arrange
|
16
|
-
prepare_app_envs(app, objectToGenXml)
|
17
|
-
doctree = load_rst_transform_to_doctree(app, objectToGenXmlType, objectToGenXml)
|
18
|
-
|
19
|
-
# Act
|
20
|
-
translator(app, '', doctree)
|
21
|
-
|
22
|
-
# Assert
|
23
|
-
argumentsDetail = app.env.docfx_yaml_classes[objectToGenXml][1]['syntax']
|
24
|
-
parameters = argumentsDetail.get('parameters', None)
|
25
|
-
keywordOnlyArguments = argumentsDetail.get('keywordOnlyArguments', None)
|
26
|
-
positionalOnlyArguments = argumentsDetail.get('positionalOnlyArguments', None)
|
27
|
-
assert (parameters != None)
|
28
|
-
assert (keywordOnlyArguments != None)
|
29
|
-
assert (positionalOnlyArguments != None)
|
30
|
-
assert (parameters[1]['id'] == 'parameter_with_default_value')
|
31
|
-
assert (parameters[1]['defaultValue'] == 'True')
|
32
|
-
assert (keywordOnlyArguments[0]['id'] == 'keyword_only_arg')
|
33
|
-
assert (keywordOnlyArguments[0]['defaultValue'] == 'keyword_only_arg_default_value')
|
34
|
-
assert (positionalOnlyArguments[0]['id'] == 'positional_only_arg')
|
35
|
-
assert (positionalOnlyArguments[0]['defaultValue'] == '10')
|
File without changes
|
File without changes
|