summaryrefslogtreecommitdiffstats
path: root/makeapi
diff options
context:
space:
mode:
authorMartin Kosek <mkosek@redhat.com>2011-11-15 14:47:43 +0100
committerSimo Sorce <ssorce@redhat.com>2012-01-11 12:04:17 -0500
commitc601809201c953af16b43261ceb82f842a3e3c1b (patch)
treef93cd62dd38a834cac7bc76c63347f8efc3c02b3 /makeapi
parentaa7c31da55b98f01d7907b7c584f95b4658a39c6 (diff)
downloadfreeipa.git-c601809201c953af16b43261ceb82f842a3e3c1b.tar.gz
freeipa.git-c601809201c953af16b43261ceb82f842a3e3c1b.tar.xz
freeipa.git-c601809201c953af16b43261ceb82f842a3e3c1b.zip
Remove redundant information from API.txt
Some Param or Output attributes do not cause API incompatibility (e.g. doc, label or callables) and does not need to be included in API.txt. When these attributes are modified, a lot of bogus changes may get in API.txt - making the real API changes less detectable. https://fedorahosted.org/freeipa/ticket/2107
Diffstat (limited to 'makeapi')
-rwxr-xr-xmakeapi74
1 files changed, 57 insertions, 17 deletions
diff --git a/makeapi b/makeapi
index af3b0f96..755849f4 100755
--- a/makeapi
+++ b/makeapi
@@ -2,6 +2,7 @@
# Authors:
# Rob Crittenden <rcritten@redhat.com>
# John Dennis <jdennis@redhat.com>
+# Martin Kosek <mkosek@redhat.com>
#
# Copyright (C) 2011 Red Hat
# see file 'COPYING' for use and warranty information
@@ -26,7 +27,9 @@ import sys
import os
import re
import inspect
-from ipalib import *
+from ipalib import api
+from ipalib.parameters import Param
+from ipalib.output import Output
from ipalib.text import Gettext, NGettext
API_FILE='API.txt'
@@ -36,6 +39,21 @@ API_NEW_COMMAND = 2
API_NO_FILE = 4
API_DOC_ERROR = 8
+# attributes removed from Param.__kw dictionary
+PARAM_IGNORED_KW_ATTRIBUTES = ('label',
+ 'doc',
+ 'normalizer',
+ 'encoder',
+ 'default_from',
+ 'create_default',
+ 'hint',
+ 'flags',
+ 'sortorder',)
+
+# attributes removed from Output object
+OUTPUT_IGNORED_ATTRIBUTES = ('doc',
+ 'flags',)
+
def parse_options():
from optparse import OptionParser
@@ -49,15 +67,37 @@ def parse_options():
options, args = parser.parse_args()
return options, args
-def strip_doc(line):
- """
- Remove the doc= part from the repr() of a Parameter.
+def param_repr(p):
"""
+ Return parameter repr() for API.txt purposes.
- # this pattern allows up to 2 nested parentheses in doc part
- newline = re.sub(r', doc=([^(,]+)(\([^()]*(\([^()]+\)[^()]*)?\))?', '', line)
+ Some Param attributes do not cause API incompatibility (e.g. doc,
+ label or callables) and should not be added to API.txt. These attributes
+ are removed from the parameter before repr() is called.
- return newline
+ NOTE: since the parameter is not not deepcopy()'ed before attributes are
+ removed, the original parameter is changed in the process. This is OK
+ for ./makeapi since we don't need this attributes anyway (except for
+ validate_doc() which is, however, called before any param_repr() call).
+ """
+ if isinstance(p, Output):
+ for attr in OUTPUT_IGNORED_ATTRIBUTES:
+ try:
+ object.__delattr__(p, attr)
+ except AttributeError:
+ pass
+ return repr(p)
+ elif isinstance(p, Param):
+ param_kw = p.__dict__['_Param__kw']
+ for attr in PARAM_IGNORED_KW_ATTRIBUTES:
+ try:
+ del param_kw[attr]
+ except KeyError:
+ pass
+ object.__setattr__(p, 'rules', {})
+ return repr(p)
+ else:
+ raise ValueError('Unsupported parameter type!')
def validate_doc():
"""
@@ -166,11 +206,11 @@ def make_api():
fd.write('command: %s\n' % cmd.name)
fd.write('args: %d,%d,%d\n' % (len(cmd.args), len(cmd.options), len(cmd.output)))
for a in cmd.args():
- fd.write('arg: %s\n' % strip_doc(repr(a)))
+ fd.write('arg: %s\n' % param_repr(a))
for o in cmd.options():
- fd.write('option: %s\n' % strip_doc(repr(o)))
+ fd.write('option: %s\n' % param_repr(o))
for o in cmd.output():
- fd.write('output: %s\n' % strip_doc(repr(o)))
+ fd.write('output: %s\n' % param_repr(o))
fd.close()
return 0
@@ -211,17 +251,17 @@ def _finalize_command_validation(cmd, found_args, expected_args,
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)))
+ a.param_spec, cmd.name, param_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)))
+ o.param_spec, cmd.name, param_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)))
+ o.name, cmd.name, param_repr(o))
passed = False
return passed
@@ -280,13 +320,13 @@ def validate_api():
found = False
arg = find_name(line)
for a in cmd.args():
- if strip_doc(repr(a)) == line:
+ if param_repr(a) == line:
found = True
else:
if a.name == arg:
found = True
print 'Arg in %s doesn\'t match.\nGot %s\nExpected %s' % (
- name, strip_doc(repr(a)), line)
+ name, param_repr(a), line)
rval |= API_FILE_DIFFERENCE
if found:
found_args.append(arg)
@@ -299,7 +339,7 @@ def validate_api():
found = False
option = find_name(line)
for o in cmd.options():
- if strip_doc(repr(o)) == line:
+ if param_repr(o) == line:
found = True
else:
if o.name == option:
@@ -317,7 +357,7 @@ def validate_api():
found = False
output = find_name(line)
for o in cmd.output():
- if strip_doc(repr(o)) == line:
+ if param_repr(o) == line:
found = True
else:
if o.name == output: