diff options
author | Simon Feltman <sfeltman@src.gnome.org> | 2014-01-07 07:31:22 -0800 |
---|---|---|
committer | Simon Feltman <sfeltman@src.gnome.org> | 2014-01-07 07:31:22 -0800 |
commit | f6a87935596a3b59c238a5572b288f34691b53d1 (patch) | |
tree | 4501e595fcb39036b1bc65eb40665e77f1839d5c | |
parent | f114edc0a0afa64077a13459034afc4255b7a3f1 (diff) | |
download | pygobject-f6a87935596a3b59c238a5572b288f34691b53d1.tar.gz |
docs: Fix array length argument skipping with preceding out arguments
Remove split_function_info_args and use a list of all arguments for
generating skipped index lists. Determine argument skipping based on the
full argument list in each in/inout and out/inout argument list buildouts.
This fixes a problem where out arguments preceding array length arguments
would still show array length arguments in the docstring. This was due to an
index mismatch when using split lists instead of list of all arguments.
-rw-r--r-- | gi/docstring.py | 38 | ||||
-rw-r--r-- | tests/test_docstring.py | 37 |
2 files changed, 27 insertions, 48 deletions
diff --git a/gi/docstring.py b/gi/docstring.py index 77332e86..a1b8a512 100644 --- a/gi/docstring.py +++ b/gi/docstring.py @@ -59,25 +59,6 @@ def generate_doc_string(info): return _generate_doc_string_func(info) -def split_function_info_args(info): - """Split a functions args into a tuple of two lists. - - Note that args marked as Direction.INOUT will be in both lists. - - :Returns: - Tuple of (in_args, out_args) - """ - in_args = [] - out_args = [] - for arg in info.get_arguments(): - direction = arg.get_direction() - if direction in (Direction.IN, Direction.INOUT): - in_args.append(arg) - if direction in (Direction.OUT, Direction.INOUT): - out_args.append(arg) - return (in_args, out_args) - - _type_tag_to_py_type = {TypeTag.BOOLEAN: bool, TypeTag.INT8: int, TypeTag.UINT8: int, @@ -122,7 +103,6 @@ def _get_pytype_hint(gi_type): def _generate_callable_info_doc(info): - in_args, out_args = split_function_info_args(info) in_args_strs = [] if isinstance(info, VFuncInfo): in_args_strs = ['self'] @@ -130,19 +110,22 @@ def _generate_callable_info_doc(info): if info.is_method(): in_args_strs = ['self'] + args = info.get_arguments() hint_blacklist = ('void',) - # Build a lists of indices prior to adding the docs because - # because it is possible the index retrieved comes before in - # argument being used. + # Build lists of indices prior to adding the docs because it is possible + # the index retrieved comes before input arguments being used. ignore_indices = set() user_data_indices = set() - for arg in in_args: + for arg in args: ignore_indices.add(arg.get_destroy()) ignore_indices.add(arg.get_type().get_array_length()) user_data_indices.add(arg.get_closure()) - for i, arg in enumerate(in_args): + # Build input argument strings + for i, arg in enumerate(args): + if arg.get_direction() == Direction.OUT: + continue # skip exclusively output args if i in ignore_indices: continue argstr = arg.get_name() @@ -157,6 +140,7 @@ def _generate_callable_info_doc(info): in_args_strs.append(argstr) in_args_str = ', '.join(in_args_strs) + # Build return + output argument strings out_args_strs = [] return_hint = _get_pytype_hint(info.get_return_type()) if not info.skip_return and return_hint and return_hint not in hint_blacklist: @@ -164,7 +148,9 @@ def _generate_callable_info_doc(info): argstr += ' or None' out_args_strs.append(return_hint) - for i, arg in enumerate(out_args): + for i, arg in enumerate(args): + if arg.get_direction() == Direction.IN: + continue # skip exclusively input args if i in ignore_indices: continue argstr = arg.get_name() diff --git a/tests/test_docstring.py b/tests/test_docstring.py index e956f7de..a46d2e60 100644 --- a/tests/test_docstring.py +++ b/tests/test_docstring.py @@ -1,7 +1,6 @@ import unittest import gi.docstring -from gi.docstring import _get_pytype_hint from gi.repository import GIMarshallingTests from gi.repository import Gio @@ -10,6 +9,7 @@ try: cairo = cairo has_cairo = True from gi.repository import Regress + from gi.repository import Gtk except ImportError: has_cairo = False @@ -30,27 +30,6 @@ class Test(unittest.TestCase): self.assertEqual(gi.docstring.get_doc_string_generator(), old_func) - def test_split_args_multi_out(self): - in_args, out_args = gi.docstring.split_function_info_args(GIMarshallingTests.int_out_out) - self.assertEqual(len(in_args), 0) - self.assertEqual(len(out_args), 2) - self.assertEqual(_get_pytype_hint(out_args[0].get_type()), 'int') - self.assertEqual(_get_pytype_hint(out_args[1].get_type()), 'int') - - def test_split_args_inout(self): - in_args, out_args = gi.docstring.split_function_info_args(GIMarshallingTests.long_inout_max_min) - self.assertEqual(len(in_args), 1) - self.assertEqual(len(out_args), 1) - self.assertEqual(in_args[0].get_name(), out_args[0].get_name()) - self.assertEqual(_get_pytype_hint(in_args[0].get_type()), - _get_pytype_hint(out_args[0].get_type())) - - def test_split_args_none(self): - obj = GIMarshallingTests.Object(int=33) - in_args, out_args = gi.docstring.split_function_info_args(obj.none_inout) - self.assertEqual(len(in_args), 1) - self.assertEqual(len(out_args), 1) - def test_final_signature_with_full_inout(self): self.assertEqual(GIMarshallingTests.Object.full_inout.__doc__, 'full_inout(object:GIMarshallingTests.Object) -> object:GIMarshallingTests.Object') @@ -91,3 +70,17 @@ class Test(unittest.TestCase): def test_private_struct_constructors(self): doc = Regress.TestBoxedPrivate.__doc__ self.assertTrue('TestBoxedPrivate()' not in doc) + + def test_array_inout_etc(self): + self.assertEqual(GIMarshallingTests.array_inout_etc.__doc__, + 'array_inout_etc(first:int, ints:list, last:int) -> ints:list, sum:int') + + def test_array_out_etc(self): + self.assertEqual(GIMarshallingTests.array_out_etc.__doc__, + 'array_out_etc(first:int, last:int) -> ints:list, sum:int') + + @unittest.skipUnless(has_cairo, 'built without cairo support') + def test_shared_array_length_with_prior_out_arg(self): + # Test the 'iter' out argument does not effect length argument skipping. + self.assertEqual(Gtk.ListStore.insert_with_valuesv.__doc__, + 'insert_with_valuesv(self, position:int, columns:list, values:list) -> iter:Gtk.TreeIter') |