70
70
from usethis ._integrations .uv .used import is_uv_used
71
71
from usethis ._io import Key , KeyValueFileManager
72
72
73
- ResolutionT : TypeAlias = Literal ["first" , "bespoke" ]
73
+ ResolutionT : TypeAlias = Literal ["first" , "first_content" , " bespoke" ]
74
74
75
75
76
76
class ConfigSpec (BaseModel ):
@@ -87,6 +87,10 @@ class ConfigSpec(BaseModel):
87
87
- "first": Using the order in file_managers, the first file found to
88
88
exist is used. All subsequent files are ignored. If no files are
89
89
found, the preferred file manager is used.
90
+ - "first_content": Using the order in file_managers, the first file
91
+ to contain managed configuration (as per config_items) is used.
92
+ All subsequent files are ignored. If no files are found with any
93
+ managed config, the found, the preferred file manager is used.
90
94
config_items: A list of configuration items that can be managed by the tool.
91
95
"""
92
96
@@ -341,21 +345,15 @@ def _get_active_config_file_managers_from_resolution(
341
345
path = Path .cwd () / relative_path
342
346
if path .exists () and path .is_file ():
343
347
return {file_manager }
344
-
345
- file_managers = file_manager_by_relative_path .values ()
346
- if not file_managers :
347
- return set ()
348
-
349
- # Use the preferred default file since there's no existing file.
350
- preferred_file_manager = self .preferred_file_manager ()
351
- if preferred_file_manager not in file_managers :
352
- msg = (
353
- f"The preferred file manager '{ preferred_file_manager } ' is not "
354
- f"among the file managers '{ file_managers } ' for the tool "
355
- f"'{ self .name } '"
356
- )
357
- raise NotImplementedError (msg )
358
- return {preferred_file_manager }
348
+ elif resolution == "first_content" :
349
+ config_spec = self .get_config_spec ()
350
+ for relative_path , file_manager in file_manager_by_relative_path .items ():
351
+ path = Path .cwd () / relative_path
352
+ if path .exists () and path .is_file ():
353
+ # We check whether any of the managed config exists
354
+ for config_item in config_spec .config_items :
355
+ if config_item .root [relative_path ].keys in file_manager :
356
+ return {file_manager }
359
357
elif resolution == "bespoke" :
360
358
msg = (
361
359
"The bespoke resolution method is not yet implemented for the tool "
@@ -365,6 +363,20 @@ def _get_active_config_file_managers_from_resolution(
365
363
else :
366
364
assert_never (resolution )
367
365
366
+ file_managers = file_manager_by_relative_path .values ()
367
+ if not file_managers :
368
+ return set ()
369
+
370
+ preferred_file_manager = self .preferred_file_manager ()
371
+ if preferred_file_manager not in file_managers :
372
+ msg = (
373
+ f"The preferred file manager '{ preferred_file_manager } ' is not "
374
+ f"among the file managers '{ file_managers } ' for the tool "
375
+ f"'{ self .name } '"
376
+ )
377
+ raise NotImplementedError (msg )
378
+ return {preferred_file_manager }
379
+
368
380
def preferred_file_manager (self ) -> KeyValueFileManager :
369
381
"""If there is no currently active config file, this is the preferred one."""
370
382
return PyprojectTOMLManager ()
@@ -615,7 +627,7 @@ def get_config_spec(self) -> ConfigSpec:
615
627
SetupCFGManager (),
616
628
PyprojectTOMLManager (),
617
629
],
618
- resolution = "first " ,
630
+ resolution = "first_content " ,
619
631
config_items = [
620
632
ConfigItem (
621
633
description = "Overall config" ,
0 commit comments