1717import threading
1818from dataclasses import dataclass
1919from datetime import datetime , timezone
20- from functools import lru_cache
2120from pathlib import Path
2221from urllib import error as urllib_error
2322from urllib import request as urllib_request
3938CHECK_TASK_PRIORITY = ("check" , "typing" , "pyright" , "mypy" , "lint" )
4039AZURE_MONITOR_OPENTELEMETRY = "azure-monitor-opentelemetry"
4140OPENTELEMETRY_SDK = "opentelemetry-sdk"
41+ VALIDATION_TOOL_DEV_PINS = frozenset ({"mypy" , "pyrefly" , "pyright" , "ruff" , "ty" , "zuban" })
4242REQ_PATTERN = r"^\s*([A-Za-z0-9_.-]+(?:\[[^\]]+\])?)\s*(.*?)\s*$"
4343SECTION_HEADER_PATTERN = re .compile (r"^\s*\[([^\]]+)\]\s*$" )
4444INLINE_ARRAY_ASSIGNMENT_PATTERN = re .compile (
@@ -252,25 +252,6 @@ def _exact_pin_version(requirement: Requirement) -> Version | None:
252252 return None
253253
254254
255- @lru_cache (maxsize = 8 )
256- def _load_workspace_package_versions (workspace_root : str ) -> dict [str , Version ]:
257- workspace_path = Path (workspace_root )
258- versions : dict [str , Version ] = {}
259- for package_pyproject in sorted ((workspace_path / "packages" ).glob ("*/pyproject.toml" )):
260- with package_pyproject .open ("rb" ) as f :
261- package_data = tomli .load (f )
262- project_section = package_data .get ("project" , {}) or {}
263- package_name = str (project_section .get ("name" , "" )).strip ().lower ()
264- package_version = project_section .get ("version" )
265- if not package_name or not package_version :
266- continue
267- try :
268- versions [package_name ] = Version (str (package_version ))
269- except InvalidVersion :
270- continue
271- return versions
272-
273-
274255def _collect_dev_pin_replacements (
275256 pyproject_file : Path ,
276257 * ,
@@ -287,8 +268,6 @@ def _collect_dev_pin_replacements(
287268 optional_dependencies .keys (),
288269 dependency_groups .keys (),
289270 )
290- workspace_versions = _load_workspace_package_versions (str (pyproject_file .parent .parent .parent .resolve ()))
291-
292271 dev_requirements : list [str ] = []
293272 dev_requirements .extend (
294273 requirement for requirement in (optional_dependencies .get ("dev" , []) or []) if isinstance (requirement , str )
@@ -322,16 +301,27 @@ def _collect_dev_pin_replacements(
322301 continue
323302 dependency_name = parsed_requirement .name .lower ()
324303 if dependency_name .startswith ("agent-framework" ):
325- latest_version = workspace_versions .get (dependency_name )
326- else :
327- # Dev-tool refreshes should follow the selected version source (PyPI by default)
328- # instead of being pinned by the current lockfile. VersionCatalog already falls
329- # back to lock data when PyPI cannot be reached or --version-source=lock is used.
330- latest_version = _select_latest_dev_version (catalog .get (dependency_name ))
304+ logger .info (
305+ "Skipping %s in %s because internal package pins are maintained by package versioning." ,
306+ dependency_name ,
307+ pyproject_file ,
308+ )
309+ continue
310+ # Dev-tool refreshes should follow the selected version source (PyPI by default)
311+ # instead of being pinned by the current lockfile. VersionCatalog already falls
312+ # back to lock data when PyPI cannot be reached or --version-source=lock is used.
313+ latest_version = _select_latest_dev_version (catalog .get (dependency_name ))
331314 if latest_version is None :
332315 continue
333316 current_exact_version = _exact_pin_version (parsed_requirement )
334- if current_exact_version is None and not dependency_name .startswith ("agent-framework" ):
317+ if current_exact_version is not None and dependency_name in VALIDATION_TOOL_DEV_PINS :
318+ logger .info (
319+ "Skipping %s in %s because validation tool upgrades should be handled separately." ,
320+ dependency_name ,
321+ pyproject_file ,
322+ )
323+ continue
324+ if current_exact_version is None :
335325 locked_version = _select_latest_dev_version (catalog .get_lock (dependency_name ))
336326 if locked_version is not None :
337327 latest_version = locked_version
0 commit comments