@@ -313,7 +313,7 @@ void package_lxml_reexported_symbol_fqn() {
313
313
@ Test
314
314
void package_sqlite3_connect_type_in_ambiguous_symbol () {
315
315
Map <String , Symbol > sqlite3Symbols = symbolsForModule ("sqlite3" );
316
- ClassSymbol connectionSymbol = (ClassSymbol ) sqlite3Symbols .get ("Connection" );
316
+ ClassSymbol connectionSymbol = (ClassSymbol ) sqlite3Symbols .get ("Connection" );
317
317
AmbiguousSymbol cursorFunction = connectionSymbol .declaredMembers ().stream ().filter (m -> "cursor" .equals (m .name ())).findFirst ().map (AmbiguousSymbol .class ::cast ).get ();
318
318
Set <Symbol > alternatives = cursorFunction .alternatives ();
319
319
assertThat (alternatives )
@@ -378,21 +378,21 @@ void deserialize_nonexistent_or_incorrect_protobuf() {
378
378
void class_symbols_from_protobuf () throws TextFormat .ParseException {
379
379
SymbolsProtos .ModuleSymbol moduleSymbol = moduleSymbol (
380
380
"fully_qualified_name: \" mod\" \n " +
381
- "classes {\n " +
382
- " name: \" Base\" \n " +
383
- " fully_qualified_name: \" mod.Base\" \n " +
384
- " super_classes: \" builtins.object\" \n " +
385
- "}\n " +
386
- "classes {\n " +
387
- " name: \" C\" \n " +
388
- " fully_qualified_name: \" mod.C\" \n " +
389
- " super_classes: \" builtins.str\" \n " +
390
- "}\n " +
391
- "classes {\n " +
392
- " name: \" D\" \n " +
393
- " fully_qualified_name: \" mod.D\" \n " +
394
- " super_classes: \" NOT_EXISTENT\" \n " +
395
- "}" );
381
+ "classes {\n " +
382
+ " name: \" Base\" \n " +
383
+ " fully_qualified_name: \" mod.Base\" \n " +
384
+ " super_classes: \" builtins.object\" \n " +
385
+ "}\n " +
386
+ "classes {\n " +
387
+ " name: \" C\" \n " +
388
+ " fully_qualified_name: \" mod.C\" \n " +
389
+ " super_classes: \" builtins.str\" \n " +
390
+ "}\n " +
391
+ "classes {\n " +
392
+ " name: \" D\" \n " +
393
+ " fully_qualified_name: \" mod.D\" \n " +
394
+ " super_classes: \" NOT_EXISTENT\" \n " +
395
+ "}" );
396
396
Map <String , Symbol > symbols = TypeShed .getSymbolsFromProtobufModule (moduleSymbol );
397
397
assertThat (symbols .values ()).extracting (Symbol ::kind , Symbol ::fullyQualifiedName )
398
398
.containsExactlyInAnyOrder (tuple (Kind .CLASS , "mod.Base" ), tuple (Kind .CLASS , "mod.C" ), tuple (Kind .CLASS , "mod.D" ));
@@ -408,44 +408,44 @@ void class_symbols_from_protobuf() throws TextFormat.ParseException {
408
408
void function_symbols_from_protobuf () throws TextFormat .ParseException {
409
409
SymbolsProtos .ModuleSymbol moduleSymbol = moduleSymbol (
410
410
"fully_qualified_name: \" mod\" \n " +
411
- "functions {\n " +
412
- " name: \" foo\" \n " +
413
- " fully_qualified_name: \" mod.foo\" \n " +
414
- " parameters {\n " +
415
- " name: \" p\" \n " +
416
- " kind: POSITIONAL_OR_KEYWORD\n " +
417
- " }\n " +
418
- "}\n " +
419
- "overloaded_functions {\n " +
420
- " name: \" bar\" \n " +
421
- " fullname: \" mod.bar\" \n " +
422
- " definitions {\n " +
423
- " name: \" bar\" \n " +
424
- " fully_qualified_name: \" mod.bar\" \n " +
425
- " parameters {\n " +
426
- " name: \" x\" \n " +
427
- " kind: POSITIONAL_OR_KEYWORD\n " +
428
- " }\n " +
429
- " has_decorators: true\n " +
430
- " resolved_decorator_names: \" typing.overload\" \n " +
431
- " is_overload: true\n " +
432
- " }\n " +
433
- " definitions {\n " +
434
- " name: \" bar\" \n " +
435
- " fully_qualified_name: \" mod.bar\" \n " +
436
- " parameters {\n " +
437
- " name: \" x\" \n " +
438
- " kind: POSITIONAL_OR_KEYWORD\n " +
439
- " }\n " +
440
- " parameters {\n " +
441
- " name: \" y\" \n " +
442
- " kind: POSITIONAL_OR_KEYWORD\n " +
443
- " }\n " +
444
- " has_decorators: true\n " +
445
- " resolved_decorator_names: \" typing.overload\" \n " +
446
- " is_overload: true\n " +
447
- " }\n " +
448
- "}\n " );
411
+ "functions {\n " +
412
+ " name: \" foo\" \n " +
413
+ " fully_qualified_name: \" mod.foo\" \n " +
414
+ " parameters {\n " +
415
+ " name: \" p\" \n " +
416
+ " kind: POSITIONAL_OR_KEYWORD\n " +
417
+ " }\n " +
418
+ "}\n " +
419
+ "overloaded_functions {\n " +
420
+ " name: \" bar\" \n " +
421
+ " fullname: \" mod.bar\" \n " +
422
+ " definitions {\n " +
423
+ " name: \" bar\" \n " +
424
+ " fully_qualified_name: \" mod.bar\" \n " +
425
+ " parameters {\n " +
426
+ " name: \" x\" \n " +
427
+ " kind: POSITIONAL_OR_KEYWORD\n " +
428
+ " }\n " +
429
+ " has_decorators: true\n " +
430
+ " resolved_decorator_names: \" typing.overload\" \n " +
431
+ " is_overload: true\n " +
432
+ " }\n " +
433
+ " definitions {\n " +
434
+ " name: \" bar\" \n " +
435
+ " fully_qualified_name: \" mod.bar\" \n " +
436
+ " parameters {\n " +
437
+ " name: \" x\" \n " +
438
+ " kind: POSITIONAL_OR_KEYWORD\n " +
439
+ " }\n " +
440
+ " parameters {\n " +
441
+ " name: \" y\" \n " +
442
+ " kind: POSITIONAL_OR_KEYWORD\n " +
443
+ " }\n " +
444
+ " has_decorators: true\n " +
445
+ " resolved_decorator_names: \" typing.overload\" \n " +
446
+ " is_overload: true\n " +
447
+ " }\n " +
448
+ "}\n " );
449
449
Map <String , Symbol > symbols = TypeShed .getSymbolsFromProtobufModule (moduleSymbol );
450
450
assertThat (symbols .values ()).extracting (Symbol ::kind , Symbol ::fullyQualifiedName )
451
451
.containsExactlyInAnyOrder (tuple (Kind .FUNCTION , "mod.foo" ), tuple (Kind .AMBIGUOUS , "mod.bar" ));
@@ -457,7 +457,7 @@ void function_symbols_from_protobuf() throws TextFormat.ParseException {
457
457
@ Test
458
458
void pythonVersions () {
459
459
Symbol range = TypeShed .builtinSymbols ().get ("range" );
460
- assertThat (((SymbolImpl ) range ).validForPythonVersions ()).containsExactlyInAnyOrder ( "38" , "39" , "310" , "311" , "312" , "313" );
460
+ assertThat (((SymbolImpl ) range ).validForPythonVersions ()).containsExactlyInAnyOrder ("38" , "39" , "310" , "311" , "312" , "313" );
461
461
assertThat (range .kind ()).isEqualTo (Kind .CLASS );
462
462
463
463
// python 2
@@ -524,7 +524,7 @@ private static SymbolsProtos.ModuleSymbol moduleSymbol(String protobuf) throws T
524
524
@ Test
525
525
void variables_from_protobuf () throws TextFormat .ParseException {
526
526
SymbolsProtos .ModuleSymbol moduleSymbol = moduleSymbol (
527
- "fully_qualified_name: \" mod\" \n " +
527
+ "fully_qualified_name: \" mod\" \n " +
528
528
"vars {\n " +
529
529
" name: \" foo\" \n " +
530
530
" fully_qualified_name: \" mod.foo\" \n " +
@@ -564,15 +564,15 @@ void symbol_from_submodule_access() {
564
564
}
565
565
566
566
@ Test
567
- void typeshed_private_modules_should_not_affect_fqn () {
567
+ void typeshed_private_modules_should_not_affect_fqn () {
568
568
Map <String , Symbol > socketModule = symbolsForModule ("socket" );
569
569
ClassSymbol socket = (ClassSymbol ) socketModule .get ("socket" );
570
570
assertThat (socket .declaredMembers ()).extracting (Symbol ::name , Symbol ::fullyQualifiedName ).contains (tuple ("connect" , "socket.socket.connect" ));
571
571
assertThat (socket .superClasses ()).extracting (Symbol ::fullyQualifiedName ).containsExactly ("object" );
572
572
}
573
573
574
574
@ Test
575
- void overloaded_function_alias_has_function_annotated_type () {
575
+ void overloaded_function_alias_has_function_annotated_type () {
576
576
Map <String , Symbol > gettextModule = symbolsForModule ("gettext" );
577
577
Symbol translation = gettextModule .get ("translation" );
578
578
Symbol catalog = gettextModule .get ("Catalog" );
@@ -587,4 +587,16 @@ void stubFilesSymbols_third_party_symbols_should_not_be_null() {
587
587
symbolsForModule ("six" );
588
588
assertThat (TypeShed .stubFilesSymbols ()).doesNotContainNull ();
589
589
}
590
+
591
+ @ Test
592
+ void customDbStubs () {
593
+ var pgdb = symbolsForModule ("pgdb" );
594
+ assertThat (pgdb .get ("connect" )).isInstanceOf (FunctionSymbol .class );
595
+
596
+ var mysql = symbolsForModule ("mysql.connector" );
597
+ assertThat (mysql .get ("connect" )).isInstanceOf (FunctionSymbol .class );
598
+
599
+ var pymysql = symbolsForModule ("pymysql" );
600
+ assertThat (pymysql .get ("connect" )).isInstanceOf (FunctionSymbol .class );
601
+ }
590
602
}
0 commit comments