1+ import difflib
12from pathlib import Path
2- from typing import List , Set
3+ from typing import List , Set , Union
34
45from polylith import configuration , info , repo , sync
56from polylith .reporting import theme
@@ -44,28 +45,27 @@ def confirmation(diff: dict, project_name: str) -> None:
4445 console .print (components_message )
4546
4647
47- def add_bricks_to_project (
48- root : Path ,
49- ns : str ,
50- project_name : str ,
51- possible_bases : List [str ],
52- ) -> None :
53- projects_data = info .get_projects_data (root , ns )
54- project_data = next ((p for p in projects_data if p ["name" ] == project_name ), None )
48+ def sort_bases_by_closest_match (bases : Set [str ], name : str ) -> List [str ]:
49+ closest = difflib .get_close_matches (name , bases , cutoff = 0.3 )
5550
56- if not project_data :
57- return
51+ rest = sorted ([b for b in bases if b not in closest ])
52+
53+ return closest + rest
5854
59- message = f"[data]Project [proj]{ project_name } [/] created.[/]"
60- console .print (Padding (message , (0 , 0 , 1 , 0 )))
6155
62- first , * _ = possible_bases
56+ def choose_base_for_project (
57+ root : Path ,
58+ ns : str ,
59+ project_name : str ,
60+ possible_bases : Set [str ],
61+ ) -> Union [str , None ]:
62+ first , * _ = sort_bases_by_closest_match (possible_bases , project_name )
6363
6464 if not Confirm .ask (
6565 prompt = f"[data]Do you want to add bricks to the [proj]{ project_name } [/] project?[/]" ,
6666 console = console ,
6767 ):
68- return
68+ return None
6969
7070 question = "[data]What's the name of the Polylith [base]base[/] to add?[/]"
7171
@@ -78,7 +78,18 @@ def add_bricks_to_project(
7878 )
7979
8080 all_bases = info .get_bases (root , ns )
81- found_base = next ((b for b in all_bases if str .lower (b ) == str .lower (base )), None )
81+
82+ return next ((b for b in all_bases if str .lower (b ) == str .lower (base )), None )
83+
84+
85+ def add_bricks_to_project (
86+ root : Path ,
87+ ns : str ,
88+ project_data : dict ,
89+ possible_bases : Set [str ],
90+ ) -> None :
91+ project_name = project_data ["name" ]
92+ found_base = choose_base_for_project (root , ns , project_name , possible_bases )
8293
8394 if not found_base :
8495 confirmation ({}, project_name )
@@ -95,9 +106,18 @@ def run(project_name: str) -> None:
95106 root = repo .get_workspace_root (Path .cwd ())
96107 ns = configuration .get_namespace_from_config (root )
97108
98- possible_bases = sorted ( info .find_unused_bases (root , ns ) )
109+ possible_bases = info .find_unused_bases (root , ns )
99110
100111 if not possible_bases :
101112 return
102113
103- add_bricks_to_project (root , ns , project_name , possible_bases )
114+ projects_data = info .get_projects_data (root , ns )
115+ project_data = next ((p for p in projects_data if p ["name" ] == project_name ), None )
116+
117+ if not project_data :
118+ return
119+
120+ message = f"[data]Project [proj]{ project_name } [/] created.[/]"
121+ console .print (Padding (message , (0 , 0 , 1 , 0 )))
122+
123+ add_bricks_to_project (root , ns , project_data , possible_bases )
0 commit comments