This rule raises an issue when a generic class is defined through explicit inheritance of `typing.Generic` instead of using the type parameter syntax.

== Why is this an issue?

Through https://peps.python.org/pep-0695/[PEP 695], Python 3.12 introduces the type parameter syntax to allow for a more compact and explicit way to define generic classes and functions.

Prior to Python 3.12, defining a generic class would be done through the following syntax:

[source,python]
----
from typing import Generic, TypeVar

_T_co = TypeVar("_T_co", covariant=True, bound=str)

class ClassA(Generic[_T_co]):
    def method1(self) -> _T_co:
        ...
----

Since Python 3.12, it can be done with the following syntax:

[source,python]
----
class ClassA[T: str]:
    def method1(self) -> T:
        ...
----

Using the former syntax requires importing `TypeVar` and `Generic` symbols from the `typing` module. It also requires the explicit definition of a type variable in the global scope, with a redundant name provided in quotes (`T = TypeVar("T")`). This makes the definition of generic classes verbose and confusing.

It is therefore recommended to use the type parameter syntax when working with Python 3.12 and later.

=== Exceptions

This rule will only raise an issue when the Python version of the analyzed project is set to 3.12 or higher.

== How to fix it

To fix this issue, make sure to use the type parameter syntax whenever defining a generic class.

=== Code examples

==== Noncompliant code example

[source,python,diff-id=1,diff-type=noncompliant]
----
from typing import Generic, TypeVar

_T_co = TypeVar("_T_co", covariant=True, bound=str)

class ClassA(Generic[_T_co]):  # Noncompliant: Explicit definition of a TypeVar and inheritance from typing.Generic is verbose
    def method1(self) -> _T_co:
        ...
----

==== Compliant solution

[source,python,diff-id=1,diff-type=compliant]
----
class ClassA[T: str]:  # Compliant: Concise syntax for type parameter is used
    def method1(self) -> T:
        ...
----

== Resources
=== Documentation

* Python Documentation - https://docs.python.org/3.12/reference/compound_stmts.html#generic-classes[Generic classes]
* Python 3.12 Release Notes - https://docs.python.org/3.12/whatsnew/3.12.html#pep-695-type-parameter-syntax[PEP 695: Type Parameter Syntax]
* PEP 695 - https://peps.python.org/pep-0695/[Type Parameter Syntax]

ifdef::env-github,rspecator-view[]

'''
== Implementation Specification
(visible only on this page)

=== Message

Use the type parameter syntax to declare this generic class.

'''
endif::env-github,rspecator-view[]
