@@ -318,13 +318,11 @@ async def fetch_updates() -> dict[str, Any]:
318318
319319@project .command ("milestones" )
320320@click .argument ("project_id" )
321- @click .option ("--limit" , "-l" , type = int , default = 50 , help = "Maximum number of milestones to show" )
321+ @click .option (
322+ "--limit" , "-l" , type = int , default = 50 , help = "Maximum number of milestones to show"
323+ )
322324@click .pass_context
323- def list_milestones (
324- ctx : click .Context ,
325- project_id : str ,
326- limit : int
327- ) -> None :
325+ def list_milestones (ctx : click .Context , project_id : str , limit : int ) -> None :
328326 """
329327 List milestones for a project.
330328
@@ -360,10 +358,7 @@ async def fetch_milestones() -> dict[str, Any]:
360358 if milestone .get ("project" , {}).get ("id" ) == project_data ["id" ]:
361359 project_milestones .append (milestone )
362360
363- return {
364- "nodes" : project_milestones ,
365- "pageInfo" : result .get ("pageInfo" , {})
366- }
361+ return {"nodes" : project_milestones , "pageInfo" : result .get ("pageInfo" , {})}
367362
368363 return {}
369364
@@ -429,7 +424,11 @@ async def fetch_milestone() -> dict[str, Any] | None:
429424@click .option ("--target-date" , help = "Target completion date (YYYY-MM-DD)" )
430425@click .pass_context
431426def create_milestone (
432- ctx : click .Context , project_id : str , name : str , description : str | None , target_date : str | None
427+ ctx : click .Context ,
428+ project_id : str ,
429+ name : str ,
430+ description : str | None ,
431+ target_date : str | None ,
433432) -> None :
434433 """
435434 Create a new milestone for a project.
@@ -465,7 +464,9 @@ async def create_milestone_async() -> dict[str, Any]:
465464 parsed_date = datetime .strptime (target_date , "%Y-%m-%d" )
466465 formatted_date = f"{ parsed_date .strftime ('%Y-%m-%d' )} T00:00:00Z"
467466 except ValueError :
468- print_error (f"Invalid date format: { target_date } . Use YYYY-MM-DD format." )
467+ print_error (
468+ f"Invalid date format: { target_date } . Use YYYY-MM-DD format."
469+ )
469470 return {}
470471
471472 result = await client .create_milestone (
@@ -541,7 +542,9 @@ async def update_milestone_async() -> dict[str, Any]:
541542 parsed_date = datetime .strptime (target_date , "%Y-%m-%d" )
542543 formatted_date = f"{ parsed_date .strftime ('%Y-%m-%d' )} T00:00:00Z"
543544 except ValueError :
544- print_error (f"Invalid date format: { target_date } . Use YYYY-MM-DD format." )
545+ print_error (
546+ f"Invalid date format: { target_date } . Use YYYY-MM-DD format."
547+ )
545548 return {}
546549
547550 result = await client .update_milestone (
@@ -575,7 +578,9 @@ async def update_milestone_async() -> dict[str, Any]:
575578@click .argument ("milestone_id" )
576579@click .option ("--yes" , "-y" , is_flag = True , help = "Skip confirmation prompt" )
577580@click .pass_context
578- def delete_milestone (ctx : click .Context , project_id : str , milestone_id : str , yes : bool ) -> None :
581+ def delete_milestone (
582+ ctx : click .Context , project_id : str , milestone_id : str , yes : bool
583+ ) -> None :
579584 """
580585 Delete a milestone from a project.
581586
@@ -600,7 +605,10 @@ async def delete_milestone_async() -> bool:
600605
601606 try :
602607 if not yes :
603- click .confirm (f"Are you sure you want to delete milestone '{ milestone_id } '?" , abort = True )
608+ click .confirm (
609+ f"Are you sure you want to delete milestone '{ milestone_id } '?" ,
610+ abort = True ,
611+ )
604612
605613 success = asyncio .run (delete_milestone_async ())
606614 if success :
@@ -616,9 +624,13 @@ async def delete_milestone_async() -> bool:
616624@project .command ("milestone-issues" )
617625@click .argument ("project_id" )
618626@click .argument ("milestone_id" )
619- @click .option ("--limit" , "-l" , type = int , default = 50 , help = "Maximum number of issues to show" )
627+ @click .option (
628+ "--limit" , "-l" , type = int , default = 50 , help = "Maximum number of issues to show"
629+ )
620630@click .pass_context
621- def list_milestone_issues (ctx : click .Context , project_id : str , milestone_id : str , limit : int ) -> None :
631+ def list_milestone_issues (
632+ ctx : click .Context , project_id : str , milestone_id : str , limit : int
633+ ) -> None :
622634 """
623635 List issues in a project milestone.
624636
@@ -652,7 +664,9 @@ async def fetch_milestone_issues() -> dict[str, Any] | None:
652664 if not milestone_data :
653665 raise click .Abort ()
654666
655- console .print (f"[bold]Issues in milestone:[/bold] { milestone_data .get ('name' , milestone_id )} " )
667+ console .print (
668+ f"[bold]Issues in milestone:[/bold] { milestone_data .get ('name' , milestone_id )} "
669+ )
656670
657671 issues = milestone_data .get ("issues" , {}).get ("nodes" , [])
658672 if not issues :
@@ -670,9 +684,18 @@ async def fetch_milestone_issues() -> dict[str, Any] | None:
670684
671685@project .command ("create-test-data" )
672686@click .option ("--team" , "-t" , required = True , help = "Team key or ID to use for test data" )
673- @click .option ("--projects" , type = int , default = 1 , help = "Number of test projects to create" )
674- @click .option ("--milestones-per-project" , type = int , default = 3 , help = "Number of milestones per project" )
675- @click .option ("--issues-per-milestone" , type = int , default = 5 , help = "Number of issues per milestone" )
687+ @click .option (
688+ "--projects" , type = int , default = 1 , help = "Number of test projects to create"
689+ )
690+ @click .option (
691+ "--milestones-per-project" ,
692+ type = int ,
693+ default = 3 ,
694+ help = "Number of milestones per project" ,
695+ )
696+ @click .option (
697+ "--issues-per-milestone" , type = int , default = 5 , help = "Number of issues per milestone"
698+ )
676699@click .pass_context
677700def create_test_data (
678701 ctx : click .Context ,
@@ -730,7 +753,9 @@ async def create_test_data_async() -> dict[str, int]:
730753
731754 # Create milestones for this project
732755 for milestone_num in range (1 , milestones_per_project + 1 ):
733- status .update (f"Creating milestone { milestone_num } for project { project_num } ..." )
756+ status .update (
757+ f"Creating milestone { milestone_num } for project { project_num } ..."
758+ )
734759
735760 milestone_name = f"Milestone { milestone_num } "
736761 milestone_result = await client .create_milestone (
@@ -740,15 +765,19 @@ async def create_test_data_async() -> dict[str, int]:
740765 )
741766
742767 if not milestone_result .get ("success" ):
743- console .print (f"[red]Failed to create milestone { milestone_name } [/red]" )
768+ console .print (
769+ f"[red]Failed to create milestone { milestone_name } [/red]"
770+ )
744771 continue
745772
746773 milestone_id = milestone_result ["projectMilestone" ]["id" ]
747774 counts ["milestones" ] += 1
748775
749776 # Create issues for this milestone
750777 for issue_num in range (1 , issues_per_milestone + 1 ):
751- status .update (f"Creating issue { issue_num } for milestone { milestone_num } ..." )
778+ status .update (
779+ f"Creating issue { issue_num } for milestone { milestone_num } ..."
780+ )
752781
753782 # WHY: Use secure random choice for realistic test data variety
754783 # Different priorities and states make testing more realistic
0 commit comments