Class PyProjectHelper

java.lang.Object
org.openrewrite.python.internal.PyProjectHelper

public class PyProjectHelper extends Object
Shared utilities for Python dependency recipes operating on pyproject.toml files.
  • Constructor Details

    • PyProjectHelper

      public PyProjectHelper()
  • Method Details

    • normalizeVersionConstraint

      public static String normalizeVersionConstraint(String version)
      Normalize a version constraint so it is valid PEP 508. When the value does not start with a comparison operator (>=, <=, etc.) we default to >=.
    • extractPackageName

      public static @Nullable String extractPackageName(String pep508Spec)
      Extract the package name from a PEP 508 dependency spec string. The name is the first token before any version specifier, extras, or marker.
    • correspondingPyprojectPath

      public static String correspondingPyprojectPath(String uvLockPath)
      Derive the pyproject.toml path that corresponds to a uv.lock path.
    • maybeUpdateUvLock

      public static @Nullable org.openrewrite.toml.tree.Toml.Document maybeUpdateUvLock(org.openrewrite.toml.tree.Toml.Document document, org.openrewrite.ExecutionContext ctx)
      If there is regenerated uv.lock content for this document, reparse the document from that content. Returns null when no update is needed (either no regenerated content exists, or the current document already matches).

      After reparsing, the stored content is normalized to the printer output so that subsequent recipe cycles see identical content and do not trigger spurious changes.

    • reparseToml

      public static org.openrewrite.toml.tree.Toml.Document reparseToml(org.openrewrite.toml.tree.Toml.Document original, String newContent)
      Reparse a TOML document from new content while preserving the original document's identity (id) and markers.
    • regenerateLockAndRefreshMarker

      public static org.openrewrite.toml.tree.Toml.Document regenerateLockAndRefreshMarker(org.openrewrite.toml.tree.Toml.Document updated, org.openrewrite.ExecutionContext ctx)
      After modifying a pyproject.toml document, regenerate the uv.lock file and refresh the PythonResolutionResult marker. Returns the updated document.

      Lock file state is shared across all Python dependency recipes via the ExecutionContext, so sequential recipes in a composite correctly build on each other's lock regeneration results.

      Parameters:
      updated - the modified pyproject.toml document
      ctx - the execution context holding shared lock file state
      Returns:
      the document with refreshed marker (and possibly a warning markup)
    • isInsideProjectDependencies

      public static boolean isInsideProjectDependencies(org.openrewrite.Cursor cursor)
      Check whether a cursor path represents a position inside the [project].dependencies array in a pyproject.toml.
    • isInsideDependencyArray

      public static boolean isInsideDependencyArray(org.openrewrite.Cursor cursor, @Nullable String scope, @Nullable String groupName)
      Check whether a cursor path represents a position inside a dependency array for the given scope and optional group name.

      Scope values use TOML dotted-key path syntax:

      • null or "project.dependencies"[project].dependencies
      • "build-system.requires"[build-system].requires
      • "project.optional-dependencies"[project.optional-dependencies].<groupName>
      • "dependency-groups"[dependency-groups].<groupName>
      • "tool.uv.constraint-dependencies"[tool.uv].constraint-dependencies
      • "tool.uv.override-dependencies"[tool.uv].override-dependencies
    • findDependencyInScope

      public static @Nullable PythonResolutionResult.Dependency findDependencyInScope(PythonResolutionResult marker, String packageName, @Nullable String scope, @Nullable String groupName)
      Find a dependency in the specified scope of the marker.
      Parameters:
      marker - the resolution result marker
      packageName - the package name to find
      scope - the scope to search (null means project.dependencies)
      groupName - the group name (required for optional-dependencies and dependency-groups)
      Returns:
      the dependency, or null if not found
    • isInsidePdmOverridesTable

      public static boolean isInsidePdmOverridesTable(org.openrewrite.Cursor cursor)
      Check whether a cursor path represents a position inside the [tool.pdm.overrides] table in a pyproject.toml.