@@ -31,11 +31,19 @@ def update():
3131 is_flag = True ,
3232 help = "Also update pre-commit hooks and pixi dependencies" ,
3333)
34- def dependencies (upgrade : bool , all : bool ):
34+ @click .option (
35+ "--exclude" ,
36+ "exclude" ,
37+ multiple = True ,
38+ metavar = "PACKAGE" ,
39+ help = "Package to exclude from upgrade (can be passed multiple times)" ,
40+ )
41+ def dependencies (upgrade : bool , all : bool , exclude : tuple [str , ...]):
3542 """Check and update project dependencies to latest versions"""
3643 from afterpython .pcu import get_dependencies , update_dependencies
3744 from afterpython .utils import has_pixi , has_uv
3845
46+ excluded = set (exclude )
3947 dependencies : Dependencies = get_dependencies ()
4048 has_at_least_one_update = False
4149 for dep_type in dependencies :
@@ -55,18 +63,31 @@ def dependencies(upgrade: bool, all: bool):
5563 for dep in deps :
5664 msg = f" { dep .requirement .name } : { dep .min_version } "
5765 has_update = dep .min_version != dep .latest_version
66+ is_excluded = dep .requirement .name in excluded
5867 if has_update :
59- has_at_least_one_update = True
68+ if not is_excluded :
69+ has_at_least_one_update = True
6070 msg += (
6171 f" → { click .style (dep .latest_version , fg = 'green' , bold = True )} "
6272 )
73+ if is_excluded :
74+ msg += f" { click .style ('(excluded)' , fg = 'yellow' )} "
6375 if category_name :
6476 msg += f" ({ category_name } )"
6577 click .echo (msg )
6678 if not has_at_least_one_update :
6779 click .echo (f"\n { click .style ('No dependencies to update.' , bold = True )} " )
6880 return
6981 if has_at_least_one_update and upgrade :
82+ if excluded :
83+ for dep_type in dependencies :
84+ for category , deps in dependencies [dep_type ].items ():
85+ dependencies [dep_type ][category ] = [
86+ dep ._replace (latest_version = dep .min_version )
87+ if dep .requirement .name in excluded
88+ else dep
89+ for dep in deps
90+ ]
7091 update_dependencies (dependencies ) # write the latest versions to pyproject.toml
7192 if has_uv ():
7293 click .echo ("Upgrading dependencies with uv..." )
@@ -89,13 +110,16 @@ def dependencies(upgrade: bool, all: bool):
89110 click .echo (
90111 "uv not found. Updated pyproject.toml only (packages not installed)."
91112 )
92- if all :
113+ if upgrade and all :
93114 subprocess .run (["ap" , "pre-commit" , "autoupdate" ])
94115 click .echo ("All pre-commit hooks updated successfully." )
95116 if has_pixi ():
96117 click .echo ("Upgrading dependencies with pixi..." )
118+ pixi_exclude_args = ["--exclude" , "python" ]
119+ for pkg in excluded :
120+ pixi_exclude_args += ["--exclude" , pkg ]
97121 result = subprocess .run (
98- ["pixi" , "upgrade" , "--exclude" , "python" ], check = False
122+ ["pixi" , "upgrade" , * pixi_exclude_args ], check = False
99123 )
100124 if result .returncode != 0 :
101125 raise Exit (result .returncode )
0 commit comments