Source code for contracts.testing.friendliness_statistics
from contracts.test_registrar import (good_examples, semantic_fail_examples,
contract_fail_examples)
from contracts import parse, ContractSyntaxError
[docs]def get_all_strings():
all_strings = (good_examples + semantic_fail_examples +
contract_fail_examples)
for contract, _, _ in all_strings:
if isinstance(contract, list):
for c in contract:
yield c
else:
yield contract
# went from 89.9% to 95.7%
[docs]def main():
examples = get_all_strings()
differences = run_joker(examples)
diff = list(differences)
unfriendliness = sum(diff) / len(diff)
friendliness = 100 - 100 * unfriendliness
print("Friendliness: %.2f%% " % friendliness)
[docs]def replace_one(s, i, c):
assert i >= 0 and i < len(s)
return s[:i] + c + s[i + 1:]
assert replace_one('python', 1, 'a') == 'pathon'
s = 'python'
for i in range(len(s)):
s2 = replace_one(s, i, '~')
s3 = replace_one(s2, i, s[i])
assert s == s3, 'i=%d %r -> %r -> %r' % (i, s, s2, s3)
[docs]def run_joker(examples):
for s in examples:
# make sure we can parse it
parse(s)
# now alter one letter
for i in range(len(s)):
s2 = replace_one(s, i, '~')
try:
parse(s2)
except ContractSyntaxError as e:
detected = e.where.col - 1
displacement = i - detected
# if displacement < 0:
# print displacement
# print e
assert displacement >= 0
value = displacement * 1.0 / len(s)
if displacement > 0:
print(e)
# assert False
yield value
if __name__ == '__main__':
main()