@@ -114,20 +114,25 @@ def available_converters(cls) -> Dict[str, Type["BaseDateConverter"]]:
114114 return {c .name : c for c in cls .subclasses ()} # type: ignore
115115
116116 @classmethod
117- def subclasses (cls ) -> list [Type ["BaseDateConverter" ]]:
117+ def subclasses (cls ) -> set [Type ["BaseDateConverter" ]]:
118118 """
119- List of available converters classes. Includes calendar convert
120- subclasses.
119+ Set of available converters classes. Includes descendant
120+ subclasses, including calendar converters, but does not include
121+ :class:`BaseCalendarConverter`.
121122 """
122123 # ensure undate converters are imported
123124 cls .import_converters ()
124125
125126 # find all direct subclasses, excluding base calendar converter
126- subclasses = cls .__subclasses__ ()
127- subclasses .remove (BaseCalendarConverter )
128- # add all subclasses of calendar converter base class
129- subclasses .extend (BaseCalendarConverter .__subclasses__ ())
130- return subclasses
127+ direct_subclasses = cls .__subclasses__ ()
128+ all_subclasses = set (direct_subclasses )
129+ # recurse to find nested subclasses
130+ for subc in direct_subclasses :
131+ all_subclasses |= subc .subclasses ()
132+
133+ # omit the calendar converter base class, which is not itself a converter
134+ all_subclasses -= {BaseCalendarConverter }
135+ return all_subclasses
131136
132137
133138class BaseCalendarConverter (BaseDateConverter ):
0 commit comments