@@ -399,6 +399,164 @@ def test_infer_sig_from_docstring_bad_indentation(self) -> None:
399
399
None ,
400
400
)
401
401
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
+
402
560
def test_infer_arg_sig_from_anon_docstring (self ) -> None :
403
561
assert_equal (
404
562
infer_arg_sig_from_anon_docstring ("(*args, **kwargs)" ),
0 commit comments