mirror of
https://salsa.debian.org/freeipa-team/freeipa.git
synced 2024-12-23 15:40:01 -06:00
Extend API validator
makeapi script is used to check if ipalib API is consistent with the known state in API.txt. When the API is changed, major API version should be updated. However, when new options/arguments/outputs were added to an ipalib command, `makeapi --validate' call did not capture this. This patch fixes this issue and ensures that also the last command in API.txt is checked (it was not before this patch). https://fedorahosted.org/freeipa/ticket/868
This commit is contained in:
parent
95b0563817
commit
5768924710
77
makeapi
77
makeapi
@ -86,6 +86,43 @@ def find_name(line):
|
||||
name = ''
|
||||
return name
|
||||
|
||||
def _finalize_command_validation(cmd, found_args, expected_args,
|
||||
found_options, expected_options,
|
||||
found_output, expected_output):
|
||||
passed = True
|
||||
# Check the args of the previous command.
|
||||
if len(found_args) != expected_args:
|
||||
print 'Argument count in %s of %d doesn\'t match expected: %d' % (
|
||||
cmd.name, len(found_args), expected_args)
|
||||
passed = False
|
||||
if len(found_options) != expected_options:
|
||||
print 'Options count in %s of %d doesn\'t match expected: %d' % (
|
||||
cmd.name, len(found_options), expected_options)
|
||||
passed = False
|
||||
if len(found_output) != expected_output:
|
||||
print 'Output count in %s of %d doesn\'t match expected: %d' % (
|
||||
cmd.name, len(found_output), expected_output)
|
||||
passed = False
|
||||
|
||||
# Check if there is not a new arg/opt/output in previous command
|
||||
for a in cmd.args():
|
||||
if a.param_spec not in found_args:
|
||||
print 'Argument %s of command %s in ipalib, not in API file:\n%s' % (
|
||||
a.param_spec, cmd.name, strip_doc(repr(a)))
|
||||
passed = False
|
||||
for o in cmd.options():
|
||||
if o.param_spec not in found_options:
|
||||
print 'Option %s of command %s in ipalib, not in API file:\n%s' % (
|
||||
o.param_spec, cmd.name, strip_doc(repr(o)))
|
||||
passed = False
|
||||
for o in cmd.output():
|
||||
if o.name not in found_output:
|
||||
print 'Output %s of command %s in ipalib, not in API file:\n%s' % (
|
||||
o.name, cmd.name, strip_doc(repr(o)))
|
||||
passed = False
|
||||
|
||||
return passed
|
||||
|
||||
def validate_api():
|
||||
"""
|
||||
Compare the API in the file to the one in ipalib.
|
||||
@ -106,19 +143,11 @@ def validate_api():
|
||||
line = line.strip()
|
||||
if line.startswith('command:'):
|
||||
if cmd:
|
||||
# Check the args of the previous command.
|
||||
if found_args != expected_args:
|
||||
print 'Argument count in %s of %d doesn\'t match expected: %d' % (
|
||||
name, found_args, expected_args)
|
||||
rval |= API_FILE_DIFFERENCE
|
||||
if found_options != expected_options:
|
||||
print 'Options count in %s of %d doesn\'t match expected: %d' % (
|
||||
name, found_options, expected_options)
|
||||
rval |= API_FILE_DIFFERENCE
|
||||
if found_output != expected_output:
|
||||
print 'Output count in %s of %d doesn\'t match expected: %d' % (
|
||||
name, found_output, expected_output)
|
||||
if not _finalize_command_validation(cmd, found_args, expected_args,
|
||||
found_options, expected_options,
|
||||
found_output, expected_output):
|
||||
rval |= API_FILE_DIFFERENCE
|
||||
|
||||
(arg, name) = line.split(': ', 1)
|
||||
if name not in api.Command:
|
||||
print "Command %s in API file, not in ipalib" % name
|
||||
@ -127,9 +156,9 @@ def validate_api():
|
||||
else:
|
||||
existing_cmds.append(name)
|
||||
cmd = api.Command[name]
|
||||
found_args = 0
|
||||
found_options = 0
|
||||
found_output = 0
|
||||
found_args = []
|
||||
found_options = []
|
||||
found_output = []
|
||||
if line.startswith('args:') and cmd:
|
||||
line = line.replace('args: ', '')
|
||||
(expected_args, expected_options, expected_output) = line.split(',')
|
||||
@ -139,18 +168,18 @@ def validate_api():
|
||||
if line.startswith('arg:') and cmd:
|
||||
line = line.replace('arg: ', '')
|
||||
found = False
|
||||
arg = find_name(line)
|
||||
for a in cmd.args():
|
||||
if strip_doc(repr(a)) == line:
|
||||
found = True
|
||||
else:
|
||||
arg = find_name(line)
|
||||
if a.name == arg:
|
||||
found = True
|
||||
print 'Arg in %s doesn\'t match.\nGot %s\nExpected %s' % (
|
||||
name, strip_doc(repr(a)), line)
|
||||
rval |= API_FILE_DIFFERENCE
|
||||
if found:
|
||||
found_args += 1
|
||||
found_args.append(arg)
|
||||
else:
|
||||
arg = find_name(line)
|
||||
print "Argument '%s' in command '%s' in API file not found" % (arg, name)
|
||||
@ -158,17 +187,17 @@ def validate_api():
|
||||
if line.startswith('option:') and cmd:
|
||||
line = line.replace('option: ', '')
|
||||
found = False
|
||||
option = find_name(line)
|
||||
for o in cmd.options():
|
||||
if strip_doc(repr(o)) == line:
|
||||
found = True
|
||||
else:
|
||||
option = find_name(line)
|
||||
if o.name == option:
|
||||
found = True
|
||||
print 'Option in %s doesn\'t match. Got %s Expected %s' % (name, o, line)
|
||||
rval |= API_FILE_DIFFERENCE
|
||||
if found:
|
||||
found_options += 1
|
||||
found_options.append(option)
|
||||
else:
|
||||
option = find_name(line)
|
||||
print "Option '%s' in command '%s' in API file not found" % (option, name)
|
||||
@ -176,22 +205,28 @@ def validate_api():
|
||||
if line.startswith('output:') and cmd:
|
||||
line = line.replace('output: ', '')
|
||||
found = False
|
||||
output = find_name(line)
|
||||
for o in cmd.output():
|
||||
if strip_doc(repr(o)) == line:
|
||||
found = True
|
||||
else:
|
||||
output = find_name(line)
|
||||
if o.name == output:
|
||||
found = True
|
||||
print 'Output in %s doesn\'t match. Got %s Expected %s' % (name, o, line)
|
||||
rval |= API_FILE_DIFFERENCE
|
||||
if found:
|
||||
found_output += 1
|
||||
found_output.append(output)
|
||||
else:
|
||||
output = find_name(line)
|
||||
print "Option '%s' in command '%s' in API file not found" % (output, name)
|
||||
rval |= API_FILE_DIFFERENCE
|
||||
|
||||
if cmd:
|
||||
if not _finalize_command_validation(cmd, found_args, expected_args,
|
||||
found_options, expected_options,
|
||||
found_output, expected_output):
|
||||
rval |= API_FILE_DIFFERENCE
|
||||
|
||||
# Now look for new commands not in the current API
|
||||
for cmd in api.Command():
|
||||
if cmd.name not in existing_cmds:
|
||||
|
Loading…
Reference in New Issue
Block a user