summaryrefslogtreecommitdiffstats
path: root/makeapi
diff options
context:
space:
mode:
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: