Skip to content

Commit c9a9ff8

Browse files
authored
Merge pull request #4 from openapi-json-schema-tools/feat_adds_key_info_to_required_report
Adds required key info
2 parents f8ad02e + e0f6e75 commit c9a9ff8

File tree

6 files changed

+21494
-32
lines changed

6 files changed

+21494
-32
lines changed

analyze.py

+10-3
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ def write_required_report(filtered_document_paths: typing.List[str], metrics_dat
3535
table_headers=('Metric', 'Qty'),
3636
table_data=tuple({
3737
'openapi_documents_qty': len(filtered_document_paths),
38-
'required_key_qty': metrics_data.required_key_qty,
38+
'required_usage_qty': metrics_data.required_usage_qty,
3939
'properties_adjacent_to_type_qty': len(metrics_data.required_adjacent_to_type),
4040
'properties_not_adjacent_to_type_qty': metrics_data.required_not_adjacent_to_type_qty,
4141
}.items())
@@ -45,12 +45,18 @@ def write_required_report(filtered_document_paths: typing.List[str], metrics_dat
4545
table_headers=('Type', 'Qty'),
4646
table_data=tuple(metrics_data.required_adjacent_to_type.items())
4747
)
48+
required_key_info = report.TableInfo(
49+
title='Required Key to Qty',
50+
table_headers=('Required Key', 'Qty'),
51+
table_data=tuple(metrics_data.required_key_to_qty.items())
52+
)
4853
required_report = report.ReportInfo(
4954
title='Json Schema keyword=required Usage Info',
5055
description='Counts number of required keyword usages. Analyzes keyword=type info adjacent to required. documents: 3.0.0-3.1.0 yaml specs only',
5156
table_infos={
5257
'required_info': required_info,
53-
'required_adjacent_info': required_adjacent_info
58+
'required_adjacent_info': required_adjacent_info,
59+
'required_key_info': required_key_info
5460
}
5561
)
5662
with open('reports/required_report.md', 'wt') as stream:
@@ -65,9 +71,10 @@ def write_required_report(filtered_document_paths: typing.List[str], metrics_dat
6571
print(f"properties_key_qty={metrics_data.properties_key_qty}")
6672
print(f"properties_adjacent_to_type={metrics_data.properties_adjacent_to_type}")
6773
print(f"properties_not_adjacent_to_type_qty={metrics_data.properties_not_adjacent_to_type_qty}")
68-
print(f"required_key_qty={metrics_data.required_key_qty}")
74+
print(f"required_usage_qty={metrics_data.required_usage_qty}")
6975
print(f"required_adjacent_to_type={metrics_data.required_adjacent_to_type}")
7076
print(f"required_not_adjacent_to_type_qty={metrics_data.required_not_adjacent_to_type_qty}")
77+
print(f"required_key_to_qty={metrics_data.required_key_to_qty}")
7178

7279
write_properties_report(filtered_document_paths, metrics_data)
7380
write_required_report(filtered_document_paths, metrics_data)

analyzer/loader.py

+23-5
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import typing
55

66
import yaml
7-
from yaml import constructor, resolver, _yaml
7+
from yaml import constructor, resolver, _yaml, nodes
88

99
def find_document_paths() -> typing.List[str]:
1010
# note there are no json files
@@ -38,9 +38,11 @@ class MetricsData:
3838
properties_key_qty: int = 0
3939
properties_not_adjacent_to_type_qty: int = 0
4040
properties_adjacent_to_type: typing.Dict[str, int] = dataclasses.field(default_factory=lambda: {})
41-
required_key_qty: int = 0
41+
required_usage_qty: int = 0
4242
required_not_adjacent_to_type_qty: int = 0
4343
required_adjacent_to_type: typing.Dict[str, int] = dataclasses.field(default_factory=lambda: {})
44+
required_key_to_qty: typing.Dict[str, int] = dataclasses.field(default_factory=lambda: {})
45+
4446

4547

4648
class CustomConstructor(constructor.SafeConstructor):
@@ -60,9 +62,13 @@ def construct_mapping(self, node, deep=False):
6062
else:
6163
self.metrics_data.properties_not_adjacent_to_type_qty += 1
6264
if 'required' in res:
63-
val = res['required']
64-
if type(val) is list:
65-
self.metrics_data.required_key_qty += 1
65+
required_keys = res['required']
66+
if type(required_keys) is list:
67+
self.metrics_data.required_usage_qty += 1
68+
for required_key in required_keys:
69+
if required_key not in self.metrics_data.required_key_to_qty:
70+
self.metrics_data.required_key_to_qty[required_key] = 0
71+
self.metrics_data.required_key_to_qty[required_key] += 1
6672
if 'type' in res:
6773
type_str = str(res['type'])
6874
if type_str not in self.metrics_data.required_adjacent_to_type:
@@ -73,6 +79,18 @@ def construct_mapping(self, node, deep=False):
7379

7480
return res
7581

82+
def construct_yaml_seq(self, node):
83+
# this is needed to load required list at construction time and to not use a generator that is
84+
# fired later to finish processing
85+
data = []
86+
data.extend(self.construct_sequence(node))
87+
return data
88+
89+
90+
CustomConstructor.add_constructor(
91+
'tag:yaml.org,2002:seq',
92+
CustomConstructor.construct_yaml_seq)
93+
7694

7795
class CustomLoader(
7896
_yaml.CParser,

analyzer/markdown.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,9 @@ def __render_table(
3636
dashes = '-'*(i-2)
3737
row.insert(-1, dashes.center(i))
3838
stream.write('|'.join(row)+'\n')
39-
for table_row in table_data:
39+
table_date_list = list(table_data)
40+
table_date_list.sort(key=lambda a: a[1], reverse = True)
41+
for table_row in table_date_list:
4042
row = ['', '']
4143
for i, val in enumerate(table_row):
4244
row.insert(-1, ' '+str(val).ljust(table_column_lengths[i]-1))

extracted_key_data_v3specs/required_key_to_qty.json

+1
Large diffs are not rendered by default.

reports/properties_report.md

+13-13
Original file line numberDiff line numberDiff line change
@@ -5,29 +5,29 @@ Counts number of properties keyword usages. Analyzes keyword=type info adjacent
55
## General Metrics
66
| Metric | Qty |
77
| ----------------------------------- | ------ |
8+
| properties_key_qty | 224423 |
9+
| properties_not_adjacent_to_type_qty | 7662 |
810
| openapi_documents_qty | 1878 |
9-
| properties_key_qty | 224453 |
1011
| properties_adjacent_to_type_qty | 19 |
11-
| properties_not_adjacent_to_type_qty | 7662 |
1212
## Properties Adjacent to Type Metrics
1313
| Type | Qty |
1414
| -------------------------- | ------ |
15-
| object | 215151 |
16-
| array | 44 |
15+
| object | 215121 |
1716
| {} | 1374 |
18-
| string | 18 |
1917
| Feature | 83 |
20-
| AVRO | 3 |
21-
| PROTOBUF | 2 |
22-
| [] | 55 |
23-
| directed | 1 |
18+
| ['object', 'null'] | 55 |
19+
| array | 44 |
2420
| Warning | 24 |
21+
| blob | 19 |
22+
| string | 18 |
2523
| name | 4 |
26-
| CustomActivity | 2 |
24+
| AVRO | 3 |
2725
| SpecActivity | 3 |
26+
| PROTOBUF | 2 |
2827
| PullRequestActivity | 2 |
29-
| IssueActivity | 1 |
28+
| CustomActivity | 2 |
3029
| DiscordMessageSentActivity | 2 |
31-
| GithubActivity | 1 |
32-
| blob | 19 |
3330
| String | 2 |
31+
| directed | 1 |
32+
| IssueActivity | 1 |
33+
| GithubActivity | 1 |

0 commit comments

Comments
 (0)