moto/scripts/implementation_coverage.py

102 lines
3.4 KiB
Python
Raw Normal View History

2017-08-14 21:51:50 +00:00
#!/usr/bin/env python
import moto
2018-05-09 07:21:15 +00:00
import os
from botocore import xform_name
from botocore.session import Session
import boto3
def get_moto_implementation(service_name):
if not hasattr(moto, service_name):
return None
module = getattr(moto, service_name)
if module is None:
return None
mock = getattr(module, "mock_{}".format(service_name))
if mock is None:
return None
backends = list(mock().backends.values())
if backends:
return backends[0]
def calculate_implementation_coverage():
service_names = Session().get_available_services()
coverage = {}
for service_name in service_names:
moto_client = get_moto_implementation(service_name)
real_client = boto3.client(service_name, region_name='us-east-1')
implemented = []
not_implemented = []
operation_names = [xform_name(op) for op in real_client.meta.service_model.operation_names]
for op in operation_names:
if moto_client and op in dir(moto_client):
implemented.append(op)
else:
not_implemented.append(op)
coverage[service_name] = {
'implemented': implemented,
'not_implemented': not_implemented,
}
return coverage
2018-05-09 07:21:15 +00:00
def print_implementation_coverage(coverage):
2017-11-20 18:34:40 +00:00
for service_name in sorted(coverage):
implemented = coverage.get(service_name)['implemented']
not_implemented = coverage.get(service_name)['not_implemented']
operations = sorted(implemented + not_implemented)
if implemented and not_implemented:
percentage_implemented = int(100.0 * len(implemented) / (len(implemented) + len(not_implemented)))
elif implemented:
percentage_implemented = 100
else:
percentage_implemented = 0
print("")
print("## {} - {}% implemented".format(service_name, percentage_implemented))
for op in operations:
if op in implemented:
print("- [X] {}".format(op))
else:
print("- [ ] {}".format(op))
2018-05-09 07:21:15 +00:00
def write_implementation_coverage_to_file(coverage):
# try deleting the implementation coverage file
try:
os.remove("../IMPLEMENTATION_COVERAGE.md")
except OSError:
pass
for service_name in sorted(coverage):
implemented = coverage.get(service_name)['implemented']
not_implemented = coverage.get(service_name)['not_implemented']
operations = sorted(implemented + not_implemented)
if implemented and not_implemented:
percentage_implemented = int(100.0 * len(implemented) / (len(implemented) + len(not_implemented)))
elif implemented:
percentage_implemented = 100
else:
percentage_implemented = 0
# rewrite the implementation coverage file with updated values
with open("../IMPLEMENTATION_COVERAGE.md", "a+") as file:
file.write("\n")
file.write("## {} - {}% implemented\n".format(service_name, percentage_implemented))
for op in operations:
if op in implemented:
file.write("- [X] {}\n".format(op))
else:
file.write("- [ ] {}\n".format(op))
if __name__ == '__main__':
2018-05-09 07:21:15 +00:00
cov = calculate_implementation_coverage()
write_implementation_coverage_to_file(cov)
print_implementation_coverage(cov)