7171ALL_PROVIDERS = [
7272 EnvProvider ,
7373 UvProvider ,
74- PipProvider ,
7574 PnpmProvider ,
76- NpmProvider ,
77- YarnProvider ,
78- BunProvider ,
79- BrewProvider ,
75+ PuppeteerProvider ,
8076 GemProvider ,
8177 GoGetProvider ,
8278 CargoProvider ,
79+ BrewProvider ,
8380 PlaywrightProvider ,
84- PuppeteerProvider ,
8581 AptProvider ,
8682 NixProvider ,
8783 DockerProvider ,
84+ PipProvider ,
85+ NpmProvider ,
86+ BunProvider ,
87+ YarnProvider ,
8888 DenoProvider ,
8989 AnsibleProvider ,
9090 PyinfraProvider ,
@@ -104,19 +104,32 @@ def _provider_class(provider: type[BinProvider] | BinProvider) -> type[BinProvid
104104 _provider_class (provider ).__name__ for provider in ALL_PROVIDERS
105105] # PipProvider, AptProvider, BrewProvider, etc.
106106
107+
108+ # Default provider names: names of providers that are enabled by default based on the current OS
109+ DEFAULT_PROVIDER_NAMES = [
110+ provider_name
111+ for provider_name in ALL_PROVIDER_NAMES
112+ if not (OPERATING_SYSTEM == "darwin" and provider_name == "apt" )
113+ and provider_name not in ("ansible" , "pyinfra" )
114+ ]
115+
107116# Lazy provider singletons: maps provider name -> class
108117# e.g. 'apt' -> AptProvider, 'pip' -> PipProvider, 'env' -> EnvProvider
109- _PROVIDER_CLASS_BY_NAME = {
118+ PROVIDER_CLASS_BY_NAME = {
110119 _provider_class (provider ).model_fields ["name" ].default : _provider_class (provider )
111120 for provider in ALL_PROVIDERS
112121}
113122_provider_singletons : dict = {}
114123
115124
125+ # Lazy provider singletons: maps provider name -> class
126+ # e.g. 'apt' -> AptProvider, 'pip' -> PipProvider, 'env' -> EnvProvider
127+ # This is a lazy singleton pattern that allows us to instantiate providers
128+ # only when they are needed, and not when the module is imported.
116129def __getattr__ (name : str ):
117- if name in _PROVIDER_CLASS_BY_NAME :
130+ if name in PROVIDER_CLASS_BY_NAME :
118131 if name not in _provider_singletons :
119- _provider_singletons [name ] = _PROVIDER_CLASS_BY_NAME [name ]()
132+ _provider_singletons [name ] = PROVIDER_CLASS_BY_NAME [name ]()
120133 return _provider_singletons [name ]
121134 raise AttributeError (f"module { __name__ !r} has no attribute { name !r} " )
122135
@@ -166,6 +179,9 @@ def __getattr__(name: str):
166179 "DEFAULT_PATH" ,
167180 "DEFAULT_ENV_PATH" ,
168181 "PYTHON_BIN_DIR" ,
182+ "PROVIDER_CLASS_BY_NAME" ,
183+ "ALL_PROVIDER_NAMES" ,
184+ "DEFAULT_PROVIDER_NAMES" ,
169185 # BinProviders (classes)
170186 "EnvProvider" ,
171187 "AptProvider" ,
0 commit comments