Skip to content

Commit 05944e5

Browse files
committed
Support SkipParse decorator
1 parent 37c4305 commit 05944e5

File tree

3 files changed

+34
-0
lines changed

3 files changed

+34
-0
lines changed

fire/core.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -723,6 +723,17 @@ def _MakeParseFn(fn, metadata):
723723

724724
def _ParseFn(args):
725725
"""Parses the list of `args` into (varargs, kwargs), remaining_args."""
726+
727+
skip_parse = metadata.get(decorators.SKIP_PARSE, False)
728+
729+
if skip_parse:
730+
kwargs = {}
731+
remaining_kwargs = []
732+
remaining_args = []
733+
varargs = consumed_args = args[:]
734+
capacity = False
735+
return (varargs, kwargs), consumed_args, remaining_args, capacity
736+
726737
kwargs, remaining_kwargs, remaining_args = _ParseKeywordArgs(args, fn_spec)
727738

728739
# Note: _ParseArgs modifies kwargs.
@@ -755,6 +766,9 @@ def _ParseFn(args):
755766
remaining_args += remaining_kwargs
756767

757768
consumed_args = args[:len(args) - len(remaining_args)]
769+
# Ensure remaining_ars keeps the original order.
770+
remaining_args = args[len(consumed_args):]
771+
758772
return (varargs, kwargs), consumed_args, remaining_args, capacity
759773

760774
return _ParseFn

fire/decorators.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,14 @@
2727
FIRE_METADATA = 'FIRE_METADATA'
2828
FIRE_PARSE_FNS = 'FIRE_PARSE_FNS'
2929
ACCEPTS_POSITIONAL_ARGS = 'ACCEPTS_POSITIONAL_ARGS'
30+
SKIP_PARSE = 'SKIP_PARSE'
31+
32+
33+
def SkipParse(fn):
34+
"""Set a flag to tell Fire to pass original args to decorated fn.
35+
"""
36+
_SetMetadata(fn, SKIP_PARSE, True)
37+
return fn
3038

3139

3240
def SetParseFn(fn, *arguments):

fire/decorators_test.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,13 @@ def example7(self, arg1, arg2=None, *varargs, **kwargs): # pylint: disable=keyw
9090
return arg1, arg2, varargs, kwargs
9191

9292

93+
class SkipParseArgs(object):
94+
95+
@decorators.SkipParse
96+
def example8(self, *args):
97+
return args
98+
99+
93100
class FireDecoratorsTest(testutils.BaseTestCase):
94101

95102
def testSetParseFnsNamedArgs(self):
@@ -169,6 +176,11 @@ def testSetParseFn(self):
169176
command=['example7', '1', '--arg2=2', '3', '4', '--kwarg=5']),
170177
('1', '2', ('3', '4'), {'kwarg': '5'}))
171178

179+
def testSkipParse(self):
180+
command = ['example8', 'test', '1', '--arg2=2', '3', '4', '--kwarg=5', '--flag']
181+
self.assertEqual(
182+
core.Fire(SkipParseArgs, command=command), tuple(command[1:]))
183+
172184

173185
if __name__ == '__main__':
174186
testutils.main()

0 commit comments

Comments
 (0)