py2docfx 0.1.1.dev1565184__py3-none-any.whl → 0.1.1.dev1592393__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.
@@ -51,4 +51,5 @@ def test_generate_document(tmp_path):
51
51
  assert not os.path.exists(os.path.join(yaml_path, "azure.dummy.yml"))
52
52
  assert not os.path.exists(os.path.join(yaml_path, "azure.yml"))
53
53
  assert os.path.exists(os.path.join(yaml_path, "toc.yml"))
54
+ assert os.path.exists(os.path.join(yaml_path, "index.yml"))
54
55
 
@@ -32,23 +32,18 @@ def build_finished(app, exception):
32
32
  """
33
33
  Output YAML on the file system.
34
34
  """
35
- def insert_node_to_toc_tree(toc_yaml, uid, project_name, toc_node_map):
36
- name = uid.split('.')[-1] if '.' in uid and uid.startswith(uid) and project_name != uid else uid
37
- cur_node = {'name': name, 'uid': uid}
38
-
39
- # Build nested TOC
40
- if uid.count('.') >= 1:
41
- parent_level = '.'.join(uid.split('.')[:-1])
42
- found_node = toc_node_map[parent_level] if parent_level in toc_node_map else None
43
- if found_node:
44
- found_node.pop('uid', 'No uid found')
45
- found_node.setdefault('items', []).append(cur_node)
46
- else:
47
- toc_yaml.append(cur_node)
48
- else:
49
- # if uid doesn't contain '.', the name needn't to simplify
50
- toc_yaml.append(cur_node)
51
- toc_node_map[uid] = cur_node
35
+ def find_node_in_toc_tree(toc_yaml, to_add_node):
36
+ for module in toc_yaml:
37
+ if module['name'] == to_add_node:
38
+ return module
39
+
40
+ if 'items' in module:
41
+ items = module['items']
42
+ found_module = find_node_in_toc_tree(items, to_add_node)
43
+ if found_module != None:
44
+ return found_module
45
+
46
+ return None
52
47
 
53
48
  def convert_class_to_enum_if_needed(obj):
54
49
  if (obj.get('inheritance'), None):
@@ -98,9 +93,16 @@ def build_finished(app, exception):
98
93
  app.builder.outdir, # Output Directory for Builder
99
94
  API_ROOT
100
95
  ))
96
+
97
+ def add_isrequired_if_needed(obj, key: str):
98
+ if key in obj['syntax'] and obj['type'] == '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
+
101
104
  ensuredir(normalized_outdir)
102
- project_name = app.config.project.replace('-','.')
103
- toc_node_map = {}
105
+
104
106
  toc_yaml = []
105
107
  # Used to record filenames dumped to avoid confliction
106
108
  # caused by Windows case insensitive file system
@@ -137,6 +139,7 @@ def build_finished(app, exception):
137
139
  if 'syntax' not in obj:
138
140
  obj['syntax'] = {}
139
141
  merged_params = []
142
+ merged_kwargs = []
140
143
  if 'parameters' in app.env.docfx_info_field_data[obj['uid']]:
141
144
  doc_params = app.env.docfx_info_field_data[obj['uid']].get(
142
145
  'parameters', [])
@@ -145,16 +148,29 @@ def build_finished(app, exception):
145
148
  print("Documented params don't match size of params:"" {}".format(obj['uid'])) # lgtm [py/clear-text-logging-sensitive-data]
146
149
  doc_params = remove_params_without_id(doc_params)
147
150
  merged_params = merge_params(arg_params, doc_params)
151
+ else:
152
+ merged_params = arg_params
153
+
154
+ if 'keywordOnlyArguments' in app.env.docfx_info_field_data[obj['uid']]:
155
+ kwargs_from_inspect = obj.get('syntax', {}).get('keywordOnlyArguments', [])
156
+ kwargs_from_doc = app.env.docfx_info_field_data[obj['uid']].get('keywordOnlyArguments', [])
157
+ if kwargs_from_inspect and kwargs_from_doc:
158
+ merged_kwargs = merge_params(kwargs_from_inspect, kwargs_from_doc)
148
159
 
149
160
  obj['syntax'].update(
150
161
  app.env.docfx_info_field_data[obj['uid']])
162
+
163
+ # Merging parameters and keywordOnlyArguments is required,
164
+ # becasue parameters and keywordOnlyArguments can be in both signature and docstring
165
+ # For positionalOnlyArguments, it's not required, because it's only in signature so far
151
166
  if merged_params:
152
167
  obj['syntax']['parameters'] = merged_params
168
+ if merged_kwargs:
169
+ obj['syntax']['keywordOnlyArguments'] = merged_kwargs
153
170
 
154
- if 'parameters' in obj['syntax'] and obj['type'] == 'method':
155
- for args in obj['syntax']['parameters']:
156
- if 'isRequired' not in args and 'defaultValue' not in args:
157
- args['isRequired'] = True
171
+ add_isrequired_if_needed(obj, 'parameters')
172
+ add_isrequired_if_needed(obj, 'keywordOnlyArguments')
173
+ add_isrequired_if_needed(obj, 'positionalOnlyArguments')
158
174
 
159
175
  # Raise up summary
160
176
  if 'summary' in obj['syntax'] and obj['syntax']['summary']:
@@ -218,7 +234,20 @@ def build_finished(app, exception):
218
234
  if (obj['type'] == 'class' and obj['inheritance']):
219
235
  convert_class_to_enum_if_needed(obj)
220
236
 
221
- insert_node_to_toc_tree(toc_yaml, uid, project_name, toc_node_map)
237
+ # Build nested TOC
238
+ if uid.count('.') >= 1:
239
+ parent_level = '.'.join(uid.split('.')[:-1])
240
+ found_node = find_node_in_toc_tree(toc_yaml, parent_level)
241
+
242
+ if found_node:
243
+ found_node.pop('uid', 'No uid found')
244
+ found_node.setdefault('items', [{'name': 'Overview', 'uid': parent_level}]).append(
245
+ {'name': uid, 'uid': uid})
246
+ else:
247
+ toc_yaml.append({'name': uid, 'uid': uid})
248
+
249
+ else:
250
+ toc_yaml.append({'name': uid, 'uid': uid})
222
251
 
223
252
  for data_set in (app.env.docfx_yaml_packages,
224
253
  app.env.docfx_yaml_modules,
@@ -265,8 +294,41 @@ def build_finished(app, exception):
265
294
  with open(toc_file, 'w') as writable:
266
295
  writable.write(
267
296
  dump(
268
- toc_yaml,
297
+ [{
298
+ 'name': app.config.project,
299
+ 'items': [{'name': 'Overview', 'uid': 'project-' + app.config.project}] + toc_yaml
300
+ }],
269
301
  default_flow_style=False,
270
302
  )
271
303
  )
272
-
304
+
305
+ index_file = os.path.join(normalized_outdir, 'index.yml')
306
+ index_children = []
307
+ index_references = []
308
+ for item in toc_yaml:
309
+ index_children.append(item.get('name', ''))
310
+ index_references.append({
311
+ 'uid': item.get('name', ''),
312
+ 'name': item.get('name', ''),
313
+ 'fullname': item.get('name', ''),
314
+ 'isExternal': False
315
+ })
316
+
317
+ index_obj = [{
318
+ 'uid': 'project-' + app.config.project,
319
+ 'name': app.config.project,
320
+ 'fullName': app.config.project,
321
+ 'langs': ['python'],
322
+ 'type': 'package',
323
+ 'kind': 'distribution',
324
+ 'summary': '',
325
+ 'children': index_children
326
+ }]
327
+ transformed_obj = convert_package(index_obj, app.env.docfx_info_uid_types)
328
+ mime = "PythonPackage"
329
+ if transformed_obj == None:
330
+ print("Unknown yml: " + yamlfile_path)
331
+ else:
332
+ # save file
333
+ common.write_yaml(transformed_obj, index_file, mime)
334
+ file_name_set.add(filename)
@@ -97,7 +97,9 @@ 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', []))),
100
101
  'parameters': list(map(convert_parameter_partial, obj.get('syntax', {}).get('parameters', []))),
102
+ 'keywordOnlyArguments': list(map(convert_parameter_partial, obj.get('syntax', {}).get('keywordOnlyArguments', []))),
101
103
  'return': convert_return(obj.get('syntax', {}).get('return', {}), reference_mapping),
102
104
  'exceptions': obj.get('exceptions', None),
103
105
  'examples': obj.get('example', None),
@@ -167,7 +169,9 @@ def get_constructor_and_variables(syntax_object, reference_mapping):
167
169
  if syntax_object:
168
170
  constructor_object = {
169
171
  'syntax': syntax_object.get('content', None),
170
- 'parameters': list(map(convert_parameter_partial, syntax_object.get('parameters', [])))
172
+ 'positionalOnlyArguments': list(map(convert_parameter_partial, syntax_object.get('positionalOnlyArguments', []))),
173
+ 'parameters': list(map(convert_parameter_partial, syntax_object.get('parameters', []))),
174
+ 'keywordOnlyArguments': list(map(convert_parameter_partial, syntax_object.get('keywordOnlyArguments', []))),
171
175
  }
172
176
 
173
177
  return remove_empty_values(constructor_object), list(map(convert_variable_partial, syntax_object.get('variables', [])))
@@ -110,6 +110,64 @@ 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
+ if po_arg.default:
159
+ default_value = str(po_arg.default)
160
+ if default_value != "<class 'inspect._empty'>":
161
+ positional_only_args[count]['defaultValue'] = default_value
162
+ count += 1
163
+ return positional_only_args
164
+
165
+ def removePositonalOnlyArgsFromArgs(args, positional_only_args):
166
+ for po_arg in positional_only_args:
167
+ for arg in args:
168
+ if arg['id'] == po_arg['id']:
169
+ args.remove(arg)
170
+ break
113
171
 
114
172
  def _create_datam(app, cls, module, name, _type, obj, lines=None):
115
173
  """
@@ -120,26 +178,22 @@ def _create_datam(app, cls, module, name, _type, obj, lines=None):
120
178
  lines = []
121
179
  short_name = name.split('.')[-1]
122
180
  args = []
123
-
181
+ keyword_only_args = []
182
+ positional_only_args = []
124
183
  try:
125
184
  if _type in [CLASS, METHOD, FUNCTION]:
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
185
+ if not (_type == CLASS and isinstance(type(obj).__call__, type(EnumMeta.__call__))):
186
+ signature = inspect.signature(obj)
187
+ argspec = inspect.getfullargspec(obj)
188
+
189
+ args = getParameterArgs(argspec)
190
+ keyword_only_args = getkeywordOnlyArguments(argspec)
191
+ positional_only_args = getpositionalOnlyArguments(signature)
192
+
193
+ # The args will contian both regular args and positional only args
194
+ # so we need to remove the positional only args from args
195
+ removePositonalOnlyArgsFromArgs(args, positional_only_args)
196
+
143
197
  except Exception as e:
144
198
  print("Can't get argspec for {}: {}. Exception: {}".format(type(obj), name, e))
145
199
 
@@ -160,9 +214,14 @@ def _create_datam(app, cls, module, name, _type, obj, lines=None):
160
214
  if summary:
161
215
  datam['summary'] = summary.strip(" \n\r\r")
162
216
 
163
- if args:
217
+ if args or keyword_only_args or positional_only_args:
164
218
  datam['syntax'] = {}
165
- datam['syntax']['parameters'] = args
219
+ if args:
220
+ datam['syntax']['parameters'] = args
221
+ if keyword_only_args:
222
+ datam['syntax']['keywordOnlyArguments'] = keyword_only_args
223
+ if positional_only_args:
224
+ datam['syntax']['positionalOnlyArguments'] = positional_only_args
166
225
  if cls:
167
226
  datam[CLASS] = cls
168
227
  if _type in [CLASS, MODULE, PACKAGE]:
@@ -123,6 +123,7 @@ def translator(app, docname, doctree):
123
123
  def _get_full_data(node, module_name):
124
124
  data = {
125
125
  'parameters': [],
126
+ 'keywordOnlyArguments': [],
126
127
  'variables': [],
127
128
  'exceptions': [],
128
129
  'return': {},
@@ -165,16 +166,20 @@ def translator(app, docname, doctree):
165
166
  if _is_single_paragraph(fieldbody):
166
167
  #_data = parse_parameter(ret_data, fieldtype)
167
168
  _data = parameter_utils.parse_parameter(content[0], fieldtype, app)
168
- if fieldtype in ['Parameters', 'Keyword']:
169
+ if fieldtype == 'Parameters':
169
170
  data['parameters'].append(_data)
171
+ elif fieldtype == 'Keyword':
172
+ data['keywordOnlyArguments'].append(_data)
170
173
  else:
171
174
  _data['id'] = _parse_variable_id(content[0].astext())
172
175
  data['variables'].append(_data)
173
176
  else:
174
177
  for child in content[0]:
175
178
  _data = parameter_utils.parse_parameter(child[0], fieldtype, app)
176
- if fieldtype in ['Parameters', 'Keyword']:
179
+ if fieldtype in ['Parameters']:
177
180
  data['parameters'].append(_data)
181
+ elif fieldtype == 'Keyword':
182
+ data['keywordOnlyArguments'].append(_data)
178
183
  else:
179
184
  _data['id'] = _parse_variable_id(child.astext())
180
185
  data['variables'].append(_data)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: py2docfx
3
- Version: 0.1.1.dev1565184
3
+ Version: 0.1.1.dev1592393
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
@@ -22,7 +22,7 @@ py2docfx/convert_prepare/post_process/merge_toc.py,sha256=coyae54OB1nGcCkxz9oAu-
22
22
  py2docfx/convert_prepare/subpackage_merge/merge_root_package.py,sha256=uK96qL2asuSfo_3SZaoP8XZaUvjf5mNkr17JNbZR4Lg,1026
23
23
  py2docfx/convert_prepare/subpackage_merge/merge_toc.py,sha256=nkVqe8R0m8D6cyTYV7aIpMDXorvn4-LXfU_vIK_hJBg,1706
24
24
  py2docfx/convert_prepare/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
25
- py2docfx/convert_prepare/tests/test_generate_document.py,sha256=hOAtib9pTFaZCS8QbYS6Dhz0hNGESDHPXumRIuIWp4Y,2415
25
+ py2docfx/convert_prepare/tests/test_generate_document.py,sha256=BKw8pMSsygLnv6bETlA2MIVarECzfWoNo4JglxHb-T4,2480
26
26
  py2docfx/convert_prepare/tests/test_get_source.py,sha256=c22JfobgbEbWWiNzBNYpZm2yDfo5LwBioUuRwft9WZE,5858
27
27
  py2docfx/convert_prepare/tests/test_pack.py,sha256=46JWMNzknIptDVs7D3CuxcmqBr_OKMmaw1br9H7wqco,4134
28
28
  py2docfx/convert_prepare/tests/test_package_info.py,sha256=L2ax9dItnz5QNSsSjSjEcaS6UPZxiq3MwysBB1FdJxI,2262
@@ -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=P6YnDKpEriDWJi2vSMDdDWWLpgDTtTr1--xyHKKnuGg,12728
55
+ py2docfx/docfx_yaml/build_finished.py,sha256=rkTHnRVFnXVqIECkvmYnevgqpZcLhRgVuEr22IzdZqY,15220
56
56
  py2docfx/docfx_yaml/build_init.py,sha256=lAw-fnBVQbySfZ7Sut_NpFQUjnqLOmnGQrTBBH2RXcg,1860
57
- py2docfx/docfx_yaml/common.py,sha256=Tl6OPSIcvPjFw1AvWt5Mun8pQr9NtUGQnk4zh474Py0,6316
57
+ py2docfx/docfx_yaml/common.py,sha256=tk2dVLtj1v0HKI_vDXaB_1_2_PTNblHPM1_M8-lIfGQ,6833
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
@@ -63,10 +63,10 @@ py2docfx/docfx_yaml/directives.py,sha256=zVVuNM_6AU9G6sbqL1UAyHHgPe7bkBWbthXI-PO
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
65
  py2docfx/docfx_yaml/parameter_utils.py,sha256=vCol5q2SJd1ymuyJdE_-62Tau9RP7PewQdKSimcfQuo,8700
66
- py2docfx/docfx_yaml/process_doctree.py,sha256=iKs1fsyo-1_P3RzpZBzD8G9hcOTGO78esWNZLXvSx2g,14866
66
+ py2docfx/docfx_yaml/process_doctree.py,sha256=sI3Hs-fpC8IE9kQldcrVlw4lALQgOOv0KT9Ht5BneeQ,17170
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=kJwGiXkiJgK3HPcVNX4qmt2Xwd77_DXS9Vd7LyGCFZo,25366
69
+ py2docfx/docfx_yaml/translator.py,sha256=Lfybbd28xflbq_CBH-8vCc3PkMNtoPPQJyKbPm_ywHs,25627
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
@@ -112,7 +112,7 @@ py2docfx/docfx_yaml/tests/roots/test-writer-table/conf.py,sha256=avcbnIOV2mlGQwh
112
112
  py2docfx/docfx_yaml/tests/roots/test-writer-uri/code_with_uri.py,sha256=bzWTZpY2yf_By2bOSl1GFaY3BsZpkAvwQuGztlcHKkQ,537
113
113
  py2docfx/docfx_yaml/tests/roots/test-writer-uri/conf.py,sha256=avcbnIOV2mlGQwhMQJZC4W6UGRBRhnq1QBxjPWlySxQ,260
114
114
  py2docfx/docfx_yaml/tests/utils/test_utils.py,sha256=d0OYSUQ6NyoZx5mlLdNGGNhiNmmQhjVT4hQ6jY3VE_M,3383
115
- py2docfx-0.1.1.dev1565184.dist-info/METADATA,sha256=r2yuOBZBbOC_EbvB7NwvuS4B0YosoAEcoOI0uW0ALS0,601
116
- py2docfx-0.1.1.dev1565184.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
117
- py2docfx-0.1.1.dev1565184.dist-info/top_level.txt,sha256=5dH2uP81dczt_qQJ38wiZ-gzoVWasfiJALWRSjdbnYU,9
118
- py2docfx-0.1.1.dev1565184.dist-info/RECORD,,
115
+ py2docfx-0.1.1.dev1592393.dist-info/METADATA,sha256=eciH7tuSk2d-cW9xPD3UrgWvKvOSC-lywQy1I4wICSE,601
116
+ py2docfx-0.1.1.dev1592393.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
117
+ py2docfx-0.1.1.dev1592393.dist-info/top_level.txt,sha256=5dH2uP81dczt_qQJ38wiZ-gzoVWasfiJALWRSjdbnYU,9
118
+ py2docfx-0.1.1.dev1592393.dist-info/RECORD,,