@@ -399,6 +399,164 @@ def test_infer_sig_from_docstring_bad_indentation(self) -> None:
399399 None ,
400400 )
401401
402+ def test_infer_sig_from_docstring_args_kwargs (self ) -> None :
403+ assert_equal (
404+ infer_sig_from_docstring ("func(*args, **kwargs) -> int" , "func" ),
405+ [
406+ FunctionSig (
407+ name = "func" ,
408+ args = [ArgSig (name = "*args" ), ArgSig (name = "**kwargs" )],
409+ ret_type = "int" ,
410+ )
411+ ],
412+ )
413+
414+ assert_equal (
415+ infer_sig_from_docstring ("func(*args) -> int" , "func" ),
416+ [FunctionSig (name = "func" , args = [ArgSig (name = "*args" )], ret_type = "int" )],
417+ )
418+
419+ assert_equal (
420+ infer_sig_from_docstring ("func(**kwargs) -> int" , "func" ),
421+ [FunctionSig (name = "func" , args = [ArgSig (name = "**kwargs" )], ret_type = "int" )],
422+ )
423+
424+ @pytest .mark .xfail (
425+ raises = AssertionError , reason = "Arg and kwarg signature validation not implemented yet"
426+ )
427+ def test_infer_sig_from_docstring_args_kwargs_errors (self ) -> None :
428+ # Double args
429+ assert_equal (infer_sig_from_docstring ("func(*args, *args2) -> int" , "func" ), [])
430+
431+ # Double kwargs
432+ assert_equal (infer_sig_from_docstring ("func(**kw, **kw2) -> int" , "func" ), [])
433+
434+ # args after kwargs
435+ assert_equal (infer_sig_from_docstring ("func(**kwargs, *args) -> int" , "func" ), [])
436+
437+ def test_infer_sig_from_docstring_positional_only_arguments (self ) -> None :
438+ assert_equal (
439+ infer_sig_from_docstring ("func(self, /) -> str" , "func" ),
440+ [FunctionSig (name = "func" , args = [ArgSig (name = "self" )], ret_type = "str" )],
441+ )
442+
443+ assert_equal (
444+ infer_sig_from_docstring ("func(self, x, /) -> str" , "func" ),
445+ [
446+ FunctionSig (
447+ name = "func" , args = [ArgSig (name = "self" ), ArgSig (name = "x" )], ret_type = "str"
448+ )
449+ ],
450+ )
451+
452+ assert_equal (
453+ infer_sig_from_docstring ("func(x, /, y) -> int" , "func" ),
454+ [FunctionSig (name = "func" , args = [ArgSig (name = "x" ), ArgSig (name = "y" )], ret_type = "int" )],
455+ )
456+
457+ assert_equal (
458+ infer_sig_from_docstring ("func(x, /, *args) -> str" , "func" ),
459+ [
460+ FunctionSig (
461+ name = "func" , args = [ArgSig (name = "x" ), ArgSig (name = "*args" )], ret_type = "str"
462+ )
463+ ],
464+ )
465+
466+ assert_equal (
467+ infer_sig_from_docstring ("func(x, /, *, kwonly, **kwargs) -> str" , "func" ),
468+ [
469+ FunctionSig (
470+ name = "func" ,
471+ args = [ArgSig (name = "x" ), ArgSig (name = "kwonly" ), ArgSig (name = "**kwargs" )],
472+ ret_type = "str" ,
473+ )
474+ ],
475+ )
476+
477+ def test_infer_sig_from_docstring_keyword_only_arguments (self ) -> None :
478+ assert_equal (
479+ infer_sig_from_docstring ("func(*, x) -> str" , "func" ),
480+ [FunctionSig (name = "func" , args = [ArgSig (name = "x" )], ret_type = "str" )],
481+ )
482+
483+ assert_equal (
484+ infer_sig_from_docstring ("func(x, *, y) -> str" , "func" ),
485+ [FunctionSig (name = "func" , args = [ArgSig (name = "x" ), ArgSig (name = "y" )], ret_type = "str" )],
486+ )
487+
488+ assert_equal (
489+ infer_sig_from_docstring ("func(*, x, y) -> str" , "func" ),
490+ [FunctionSig (name = "func" , args = [ArgSig (name = "x" ), ArgSig (name = "y" )], ret_type = "str" )],
491+ )
492+
493+ assert_equal (
494+ infer_sig_from_docstring ("func(x, *, kwonly, **kwargs) -> str" , "func" ),
495+ [
496+ FunctionSig (
497+ name = "func" ,
498+ args = [ArgSig (name = "x" ), ArgSig (name = "kwonly" ), ArgSig ("**kwargs" )],
499+ ret_type = "str" ,
500+ )
501+ ],
502+ )
503+
504+ def test_infer_sig_from_docstring_pos_only_and_keyword_only_arguments (self ) -> None :
505+ assert_equal (
506+ infer_sig_from_docstring ("func(x, /, *, y) -> str" , "func" ),
507+ [FunctionSig (name = "func" , args = [ArgSig (name = "x" ), ArgSig (name = "y" )], ret_type = "str" )],
508+ )
509+
510+ assert_equal (
511+ infer_sig_from_docstring ("func(x, /, y, *, z) -> str" , "func" ),
512+ [
513+ FunctionSig (
514+ name = "func" ,
515+ args = [ArgSig (name = "x" ), ArgSig (name = "y" ), ArgSig (name = "z" )],
516+ ret_type = "str" ,
517+ )
518+ ],
519+ )
520+
521+ assert_equal (
522+ infer_sig_from_docstring ("func(x, /, y, *, z, **kwargs) -> str" , "func" ),
523+ [
524+ FunctionSig (
525+ name = "func" ,
526+ args = [
527+ ArgSig (name = "x" ),
528+ ArgSig (name = "y" ),
529+ ArgSig (name = "z" ),
530+ ArgSig ("**kwargs" ),
531+ ],
532+ ret_type = "str" ,
533+ )
534+ ],
535+ )
536+
537+ def test_infer_sig_from_docstring_pos_only_and_keyword_only_arguments_errors (self ) -> None :
538+ # / as first argument
539+ assert_equal (infer_sig_from_docstring ("func(/, x) -> str" , "func" ), [])
540+
541+ # * as last argument
542+ assert_equal (infer_sig_from_docstring ("func(x, *) -> str" , "func" ), [])
543+
544+ # / after *
545+ assert_equal (infer_sig_from_docstring ("func(x, *, /, y) -> str" , "func" ), [])
546+
547+ # Two /
548+ assert_equal (infer_sig_from_docstring ("func(x, /, /, *, y) -> str" , "func" ), [])
549+
550+ assert_equal (infer_sig_from_docstring ("func(x, /, y, /, *, z) -> str" , "func" ), [])
551+
552+ # Two *
553+ assert_equal (infer_sig_from_docstring ("func(x, /, *, *, y) -> str" , "func" ), [])
554+
555+ assert_equal (infer_sig_from_docstring ("func(x, /, *, y, *, z) -> str" , "func" ), [])
556+
557+ # *args and * are not allowed
558+ assert_equal (infer_sig_from_docstring ("func(*args, *, kwonly) -> str" , "func" ), [])
559+
402560 def test_infer_arg_sig_from_anon_docstring (self ) -> None :
403561 assert_equal (
404562 infer_arg_sig_from_anon_docstring ("(*args, **kwargs)" ),
0 commit comments