move apply_argspec to koji.util
This commit is contained in:
parent
89825a8d2d
commit
d8132543c5
3 changed files with 62 additions and 64 deletions
|
|
@ -95,44 +95,6 @@ def safe_rmtree(path, unmount=False, strict=True):
|
|||
return 0
|
||||
|
||||
|
||||
|
||||
def apply_argspec(argspec, args, kwargs=None):
|
||||
"""Apply an argspec to the given args and return a dictionary"""
|
||||
if kwargs is None:
|
||||
kwargs = {}
|
||||
f_args, f_varargs, f_varkw, f_defaults = argspec
|
||||
data = dict(zip(f_args, args))
|
||||
if len(args) > len(f_args):
|
||||
if not f_varargs:
|
||||
raise koji.ParameterError, "Too many args"
|
||||
data[f_varargs] = tuple(args[len(f_args):])
|
||||
elif f_varargs:
|
||||
data[f_varargs] = ()
|
||||
if f_varkw:
|
||||
data[f_varkw] = {}
|
||||
for arg in kwargs:
|
||||
if arg in data:
|
||||
raise koji.ParameterError, "duplicate keyword argument %r" \
|
||||
% arg
|
||||
if arg in f_args:
|
||||
data[arg] = kwargs[arg]
|
||||
elif not f_varkw:
|
||||
raise koji.ParameterError, "Unexpected keyword argument %r" \
|
||||
% (arg)
|
||||
else:
|
||||
data[f_varkw][arg] = kwargs[arg]
|
||||
if f_defaults:
|
||||
for arg, val in zip(f_args[-len(f_defaults):], f_defaults):
|
||||
data.setdefault(arg, val)
|
||||
for n, arg in enumerate(f_args):
|
||||
if arg not in data:
|
||||
# missing arg
|
||||
raise koji.ParameterError, "missing required argument %r (#%i)" \
|
||||
% (arg, n)
|
||||
return data
|
||||
|
||||
|
||||
|
||||
class ServerExit(Exception):
|
||||
"""Raised to shutdown the server"""
|
||||
pass
|
||||
|
|
@ -164,7 +126,7 @@ def parse_task_params(method, params):
|
|||
err = None
|
||||
for argspec in LEGACY_SIGNATURES[method]:
|
||||
try:
|
||||
params = apply_argspec(argspec, args, kwargs)
|
||||
params = koji.util.apply_argspec(argspec, args, kwargs)
|
||||
break
|
||||
except koji.ParameterError, e:
|
||||
if not err:
|
||||
|
|
|
|||
36
koji/util.py
36
koji/util.py
|
|
@ -214,6 +214,42 @@ def call_with_argcheck(func, args, kwargs=None):
|
|||
raise
|
||||
|
||||
|
||||
def apply_argspec(argspec, args, kwargs=None):
|
||||
"""Apply an argspec to the given args and return a dictionary"""
|
||||
if kwargs is None:
|
||||
kwargs = {}
|
||||
f_args, f_varargs, f_varkw, f_defaults = argspec
|
||||
data = dict(zip(f_args, args))
|
||||
if len(args) > len(f_args):
|
||||
if not f_varargs:
|
||||
raise koji.ParameterError, "Too many args"
|
||||
data[f_varargs] = tuple(args[len(f_args):])
|
||||
elif f_varargs:
|
||||
data[f_varargs] = ()
|
||||
if f_varkw:
|
||||
data[f_varkw] = {}
|
||||
for arg in kwargs:
|
||||
if arg in data:
|
||||
raise koji.ParameterError, "duplicate keyword argument %r" \
|
||||
% arg
|
||||
if arg in f_args:
|
||||
data[arg] = kwargs[arg]
|
||||
elif not f_varkw:
|
||||
raise koji.ParameterError, "Unexpected keyword argument %r" \
|
||||
% (arg)
|
||||
else:
|
||||
data[f_varkw][arg] = kwargs[arg]
|
||||
if f_defaults:
|
||||
for arg, val in zip(f_args[-len(f_defaults):], f_defaults):
|
||||
data.setdefault(arg, val)
|
||||
for n, arg in enumerate(f_args):
|
||||
if arg not in data:
|
||||
# missing arg
|
||||
raise koji.ParameterError, "missing required argument %r (#%i)" \
|
||||
% (arg, n)
|
||||
return data
|
||||
|
||||
|
||||
class HiddenValue(object):
|
||||
"""A wrapper that prevents a value being accidentally printed"""
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
"""Test argspec functions"""
|
||||
|
||||
import koji.tasks
|
||||
import koji.util
|
||||
import unittest
|
||||
|
||||
class ArgspecCase(unittest.TestCase):
|
||||
|
|
@ -13,63 +13,63 @@ class ArgspecCase(unittest.TestCase):
|
|||
|
||||
# Start simple
|
||||
argspec = (['n'], None, None, None)
|
||||
self.assertRaises(koji.ParameterError, koji.tasks.apply_argspec,
|
||||
self.assertRaises(koji.ParameterError, koji.util.apply_argspec,
|
||||
argspec, (), None )
|
||||
self.assertRaises(koji.ParameterError, koji.tasks.apply_argspec,
|
||||
self.assertRaises(koji.ParameterError, koji.util.apply_argspec,
|
||||
argspec, (1,2), None )
|
||||
ret = koji.tasks.apply_argspec(argspec, (1,), None)
|
||||
ret = koji.util.apply_argspec(argspec, (1,), None)
|
||||
self.assertEqual(ret, {'n':1})
|
||||
ret = koji.tasks.apply_argspec(argspec, (), {'n':1})
|
||||
ret = koji.util.apply_argspec(argspec, (), {'n':1})
|
||||
self.assertEqual(ret, {'n':1})
|
||||
self.assertRaises(koji.ParameterError, koji.tasks.apply_argspec,
|
||||
self.assertRaises(koji.ParameterError, koji.util.apply_argspec,
|
||||
argspec, (1,), {'n':1} )
|
||||
self.assertRaises(koji.ParameterError, koji.tasks.apply_argspec,
|
||||
self.assertRaises(koji.ParameterError, koji.util.apply_argspec,
|
||||
argspec, (1,), {'m':1} )
|
||||
self.assertRaises(koji.ParameterError, koji.tasks.apply_argspec,
|
||||
self.assertRaises(koji.ParameterError, koji.util.apply_argspec,
|
||||
argspec, (), {'m':1} )
|
||||
|
||||
# using *args
|
||||
argspec = (['a', 'b'], 'args', None, None)
|
||||
self.assertRaises(koji.ParameterError, koji.tasks.apply_argspec,
|
||||
self.assertRaises(koji.ParameterError, koji.util.apply_argspec,
|
||||
argspec, (), None )
|
||||
self.assertRaises(koji.ParameterError, koji.tasks.apply_argspec,
|
||||
self.assertRaises(koji.ParameterError, koji.util.apply_argspec,
|
||||
argspec, (1,), None )
|
||||
ret = koji.tasks.apply_argspec(argspec, (1,2), None)
|
||||
ret = koji.util.apply_argspec(argspec, (1,2), None)
|
||||
self.assertEqual(ret, {'a':1, 'b':2, 'args': ()})
|
||||
ret = koji.tasks.apply_argspec(argspec, (1,2,3), None)
|
||||
ret = koji.util.apply_argspec(argspec, (1,2,3), None)
|
||||
self.assertEqual(ret, {'a':1, 'b':2, 'args': (3,)})
|
||||
self.assertRaises(koji.ParameterError, koji.tasks.apply_argspec,
|
||||
self.assertRaises(koji.ParameterError, koji.util.apply_argspec,
|
||||
argspec, (1,2), {'a':5} )
|
||||
self.assertRaises(koji.ParameterError, koji.tasks.apply_argspec,
|
||||
self.assertRaises(koji.ParameterError, koji.util.apply_argspec,
|
||||
argspec, (1,2), {'x':5} )
|
||||
ret = koji.tasks.apply_argspec(argspec, (1,), {'b':2})
|
||||
ret = koji.util.apply_argspec(argspec, (1,), {'b':2})
|
||||
self.assertEqual(ret, {'a':1, 'b':2, 'args': ()})
|
||||
self.assertRaises(koji.ParameterError, koji.tasks.apply_argspec,
|
||||
self.assertRaises(koji.ParameterError, koji.util.apply_argspec,
|
||||
argspec, (1,), {'b':2, 'c':3} )
|
||||
|
||||
# using **kwargs
|
||||
argspec = (['a', 'b'], None, 'kwargs', None)
|
||||
self.assertRaises(koji.ParameterError, koji.tasks.apply_argspec,
|
||||
self.assertRaises(koji.ParameterError, koji.util.apply_argspec,
|
||||
argspec, (), None )
|
||||
self.assertRaises(koji.ParameterError, koji.tasks.apply_argspec,
|
||||
self.assertRaises(koji.ParameterError, koji.util.apply_argspec,
|
||||
argspec, (), {} )
|
||||
ret = koji.tasks.apply_argspec(argspec, (), {'a':1, 'b':2})
|
||||
ret = koji.util.apply_argspec(argspec, (), {'a':1, 'b':2})
|
||||
self.assertEqual(ret, {'a':1, 'b':2, 'kwargs':{}})
|
||||
ret = koji.tasks.apply_argspec(argspec, (), {'a':1, 'b':2, 'c':3})
|
||||
ret = koji.util.apply_argspec(argspec, (), {'a':1, 'b':2, 'c':3})
|
||||
self.assertEqual(ret, {'a':1, 'b':2, 'kwargs':{'c':3}})
|
||||
ret = koji.tasks.apply_argspec(argspec, (1,2), {'c':3})
|
||||
ret = koji.util.apply_argspec(argspec, (1,2), {'c':3})
|
||||
self.assertEqual(ret, {'a':1, 'b':2, 'kwargs':{'c':3}})
|
||||
ret = koji.tasks.apply_argspec(argspec, (1,), {'b': 2, 'c':3})
|
||||
ret = koji.util.apply_argspec(argspec, (1,), {'b': 2, 'c':3})
|
||||
self.assertEqual(ret, {'a':1, 'b':2, 'kwargs':{'c':3}})
|
||||
self.assertRaises(koji.ParameterError, koji.tasks.apply_argspec,
|
||||
self.assertRaises(koji.ParameterError, koji.util.apply_argspec,
|
||||
argspec, (1,2), {'b':2} )
|
||||
|
||||
# with defaults
|
||||
argspec = (['a', 'b'], None, None, [1,2])
|
||||
ret = koji.tasks.apply_argspec(argspec, (), {})
|
||||
ret = koji.util.apply_argspec(argspec, (), {})
|
||||
self.assertEqual(ret, {'a':1, 'b':2})
|
||||
argspec = (['a', 'b'], None, None, [2])
|
||||
ret = koji.tasks.apply_argspec(argspec, (1,), {})
|
||||
ret = koji.util.apply_argspec(argspec, (1,), {})
|
||||
self.assertEqual(ret, {'a':1, 'b':2})
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue