@@ -1391,3 +1391,256 @@ class Foo(Enum):
1391
1391
x = 3
1392
1392
x = 4
1393
1393
[builtins fixtures/bool.pyi]
1394
+
1395
+ [case testEnumImplicitlyFinalForSubclassing]
1396
+ from enum import Enum, IntEnum, Flag, IntFlag
1397
+
1398
+ class NonEmptyEnum(Enum):
1399
+ x = 1
1400
+ class NonEmptyIntEnum(IntEnum):
1401
+ x = 1
1402
+ class NonEmptyFlag(Flag):
1403
+ x = 1
1404
+ class NonEmptyIntFlag(IntFlag):
1405
+ x = 1
1406
+
1407
+ class ErrorEnumWithValue(NonEmptyEnum): # E: Cannot inherit from final class "NonEmptyEnum"
1408
+ x = 1
1409
+ class ErrorIntEnumWithValue(NonEmptyIntEnum): # E: Cannot inherit from final class "NonEmptyIntEnum"
1410
+ x = 1
1411
+ class ErrorFlagWithValue(NonEmptyFlag): # E: Cannot inherit from final class "NonEmptyFlag"
1412
+ x = 1
1413
+ class ErrorIntFlagWithValue(NonEmptyIntFlag): # E: Cannot inherit from final class "NonEmptyIntFlag"
1414
+ x = 1
1415
+
1416
+ class ErrorEnumWithoutValue(NonEmptyEnum): # E: Cannot inherit from final class "NonEmptyEnum"
1417
+ pass
1418
+ class ErrorIntEnumWithoutValue(NonEmptyIntEnum): # E: Cannot inherit from final class "NonEmptyIntEnum"
1419
+ pass
1420
+ class ErrorFlagWithoutValue(NonEmptyFlag): # E: Cannot inherit from final class "NonEmptyFlag"
1421
+ pass
1422
+ class ErrorIntFlagWithoutValue(NonEmptyIntFlag): # E: Cannot inherit from final class "NonEmptyIntFlag"
1423
+ pass
1424
+ [builtins fixtures/bool.pyi]
1425
+
1426
+ [case testSubclassingNonFinalEnums]
1427
+ from enum import Enum, IntEnum, Flag, IntFlag, EnumMeta
1428
+
1429
+ def decorator(func):
1430
+ return func
1431
+
1432
+ class EmptyEnum(Enum):
1433
+ pass
1434
+ class EmptyIntEnum(IntEnum):
1435
+ pass
1436
+ class EmptyFlag(Flag):
1437
+ pass
1438
+ class EmptyIntFlag(IntFlag):
1439
+ pass
1440
+ class EmptyEnumMeta(EnumMeta):
1441
+ pass
1442
+
1443
+ class NonEmptyEnumSub(EmptyEnum):
1444
+ x = 1
1445
+ class NonEmptyIntEnumSub(EmptyIntEnum):
1446
+ x = 1
1447
+ class NonEmptyFlagSub(EmptyFlag):
1448
+ x = 1
1449
+ class NonEmptyIntFlagSub(EmptyIntFlag):
1450
+ x = 1
1451
+ class NonEmptyEnumMetaSub(EmptyEnumMeta):
1452
+ x = 1
1453
+
1454
+ class EmptyEnumSub(EmptyEnum):
1455
+ def method(self) -> None: pass
1456
+ @decorator
1457
+ def other(self) -> None: pass
1458
+ class EmptyIntEnumSub(EmptyIntEnum):
1459
+ def method(self) -> None: pass
1460
+ class EmptyFlagSub(EmptyFlag):
1461
+ def method(self) -> None: pass
1462
+ class EmptyIntFlagSub(EmptyIntFlag):
1463
+ def method(self) -> None: pass
1464
+ class EmptyEnumMetaSub(EmptyEnumMeta):
1465
+ def method(self) -> None: pass
1466
+
1467
+ class NestedEmptyEnumSub(EmptyEnumSub):
1468
+ x = 1
1469
+ class NestedEmptyIntEnumSub(EmptyIntEnumSub):
1470
+ x = 1
1471
+ class NestedEmptyFlagSub(EmptyFlagSub):
1472
+ x = 1
1473
+ class NestedEmptyIntFlagSub(EmptyIntFlagSub):
1474
+ x = 1
1475
+ class NestedEmptyEnumMetaSub(EmptyEnumMetaSub):
1476
+ x = 1
1477
+ [builtins fixtures/bool.pyi]
1478
+
1479
+ [case testEnumExplicitlyAndImplicitlyFinal]
1480
+ from typing import final
1481
+ from enum import Enum, IntEnum, Flag, IntFlag, EnumMeta
1482
+
1483
+ @final
1484
+ class EmptyEnum(Enum):
1485
+ pass
1486
+ @final
1487
+ class EmptyIntEnum(IntEnum):
1488
+ pass
1489
+ @final
1490
+ class EmptyFlag(Flag):
1491
+ pass
1492
+ @final
1493
+ class EmptyIntFlag(IntFlag):
1494
+ pass
1495
+ @final
1496
+ class EmptyEnumMeta(EnumMeta):
1497
+ pass
1498
+
1499
+ class EmptyEnumSub(EmptyEnum): # E: Cannot inherit from final class "EmptyEnum"
1500
+ pass
1501
+ class EmptyIntEnumSub(EmptyIntEnum): # E: Cannot inherit from final class "EmptyIntEnum"
1502
+ pass
1503
+ class EmptyFlagSub(EmptyFlag): # E: Cannot inherit from final class "EmptyFlag"
1504
+ pass
1505
+ class EmptyIntFlagSub(EmptyIntFlag): # E: Cannot inherit from final class "EmptyIntFlag"
1506
+ pass
1507
+ class EmptyEnumMetaSub(EmptyEnumMeta): # E: Cannot inherit from final class "EmptyEnumMeta"
1508
+ pass
1509
+
1510
+ @final
1511
+ class NonEmptyEnum(Enum):
1512
+ x = 1
1513
+ @final
1514
+ class NonEmptyIntEnum(IntEnum):
1515
+ x = 1
1516
+ @final
1517
+ class NonEmptyFlag(Flag):
1518
+ x = 1
1519
+ @final
1520
+ class NonEmptyIntFlag(IntFlag):
1521
+ x = 1
1522
+ @final
1523
+ class NonEmptyEnumMeta(EnumMeta):
1524
+ x = 1
1525
+
1526
+ class ErrorEnumWithoutValue(NonEmptyEnum): # E: Cannot inherit from final class "NonEmptyEnum"
1527
+ pass
1528
+ class ErrorIntEnumWithoutValue(NonEmptyIntEnum): # E: Cannot inherit from final class "NonEmptyIntEnum"
1529
+ pass
1530
+ class ErrorFlagWithoutValue(NonEmptyFlag): # E: Cannot inherit from final class "NonEmptyFlag"
1531
+ pass
1532
+ class ErrorIntFlagWithoutValue(NonEmptyIntFlag): # E: Cannot inherit from final class "NonEmptyIntFlag"
1533
+ pass
1534
+ class ErrorEnumMetaWithoutValue(NonEmptyEnumMeta): # E: Cannot inherit from final class "NonEmptyEnumMeta"
1535
+ pass
1536
+ [builtins fixtures/bool.pyi]
1537
+
1538
+ [case testEnumFinalSubtypingEnumMetaSpecialCase]
1539
+ from enum import EnumMeta
1540
+ # `EnumMeta` types are not `Enum`s
1541
+ class SubMeta(EnumMeta):
1542
+ x = 1
1543
+ class SubSubMeta(SubMeta):
1544
+ x = 2
1545
+ [builtins fixtures/bool.pyi]
1546
+
1547
+ [case testEnumFinalSubtypingOverloadedSpecialCase]
1548
+ from typing import overload
1549
+ from enum import Enum, IntEnum, Flag, IntFlag, EnumMeta
1550
+
1551
+ class EmptyEnum(Enum):
1552
+ @overload
1553
+ def method(self, arg: int) -> int:
1554
+ pass
1555
+ @overload
1556
+ def method(self, arg: str) -> str:
1557
+ pass
1558
+ def method(self, arg):
1559
+ pass
1560
+ class EmptyIntEnum(IntEnum):
1561
+ @overload
1562
+ def method(self, arg: int) -> int:
1563
+ pass
1564
+ @overload
1565
+ def method(self, arg: str) -> str:
1566
+ pass
1567
+ def method(self, arg):
1568
+ pass
1569
+ class EmptyFlag(Flag):
1570
+ @overload
1571
+ def method(self, arg: int) -> int:
1572
+ pass
1573
+ @overload
1574
+ def method(self, arg: str) -> str:
1575
+ pass
1576
+ def method(self, arg):
1577
+ pass
1578
+ class EmptyIntFlag(IntFlag):
1579
+ @overload
1580
+ def method(self, arg: int) -> int:
1581
+ pass
1582
+ @overload
1583
+ def method(self, arg: str) -> str:
1584
+ pass
1585
+ def method(self, arg):
1586
+ pass
1587
+ class EmptyEnumMeta(EnumMeta):
1588
+ @overload
1589
+ def method(self, arg: int) -> int:
1590
+ pass
1591
+ @overload
1592
+ def method(self, arg: str) -> str:
1593
+ pass
1594
+ def method(self, arg):
1595
+ pass
1596
+
1597
+ class NonEmptyEnumSub(EmptyEnum):
1598
+ x = 1
1599
+ class NonEmptyIntEnumSub(EmptyIntEnum):
1600
+ x = 1
1601
+ class NonEmptyFlagSub(EmptyFlag):
1602
+ x = 1
1603
+ class NonEmptyIntFlagSub(EmptyIntFlag):
1604
+ x = 1
1605
+ class NonEmptyEnumMetaSub(EmptyEnumMeta):
1606
+ x = 1
1607
+ [builtins fixtures/bool.pyi]
1608
+
1609
+ [case testEnumFinalSubtypingMethodAndValueSpecialCase]
1610
+ from enum import Enum, IntEnum, Flag, IntFlag, EnumMeta
1611
+
1612
+ def decorator(func):
1613
+ return func
1614
+
1615
+ class NonEmptyEnum(Enum):
1616
+ x = 1
1617
+ def method(self) -> None: pass
1618
+ @decorator
1619
+ def other(self) -> None: pass
1620
+ class NonEmptyIntEnum(IntEnum):
1621
+ x = 1
1622
+ def method(self) -> None: pass
1623
+ class NonEmptyFlag(Flag):
1624
+ x = 1
1625
+ def method(self) -> None: pass
1626
+ class NonEmptyIntFlag(IntFlag):
1627
+ x = 1
1628
+ def method(self) -> None: pass
1629
+
1630
+ class ErrorEnumWithoutValue(NonEmptyEnum): # E: Cannot inherit from final class "NonEmptyEnum"
1631
+ pass
1632
+ class ErrorIntEnumWithoutValue(NonEmptyIntEnum): # E: Cannot inherit from final class "NonEmptyIntEnum"
1633
+ pass
1634
+ class ErrorFlagWithoutValue(NonEmptyFlag): # E: Cannot inherit from final class "NonEmptyFlag"
1635
+ pass
1636
+ class ErrorIntFlagWithoutValue(NonEmptyIntFlag): # E: Cannot inherit from final class "NonEmptyIntFlag"
1637
+ pass
1638
+ [builtins fixtures/bool.pyi]
1639
+
1640
+ [case testFinalEnumWithClassDef]
1641
+ from enum import Enum
1642
+
1643
+ class A(Enum):
1644
+ class Inner: pass
1645
+ class B(A): pass # E: Cannot inherit from final class "A"
1646
+ [builtins fixtures/bool.pyi]
0 commit comments