From dce2d0f3df0294a4e3c1aaacb09d465894ff7836 Mon Sep 17 00:00:00 2001 From: Xueqin Cui Date: Wed, 25 Feb 2026 17:42:05 +1100 Subject: [PATCH 1/2] util/resolve: add support for PyPI requirements in API client --- util/resolve/api.go | 27 +++++++++++++++++ util/resolve/api_test.go | 64 ++++++++++++++++++++++++++++++++++++++++ util/resolve/go.mod | 2 +- util/resolve/go.sum | 4 +-- 4 files changed, 94 insertions(+), 3 deletions(-) diff --git a/util/resolve/api.go b/util/resolve/api.go index 08e6f7bc..7d2ff219 100644 --- a/util/resolve/api.go +++ b/util/resolve/api.go @@ -174,10 +174,37 @@ func (a *APIClient) Requirements(ctx context.Context, vk VersionKey) ([]Requirem return a.mavenRequirements(ctx, vk, resp.Maven) case NPM: return a.npmRequirements(vk, resp.Npm) + case PyPI: + return a.pypiRequirements(resp.Pypi) } return nil, errors.New("unsupported system") } +func (a *APIClient) pypiRequirements(reqs *pb.Requirements_PyPI) ([]RequirementVersion, error) { + var result []RequirementVersion + for _, d := range reqs.GetDependencies() { + var t dep.Type + if d.Extras != "" { + t.AddAttr(dep.EnabledDependencies, d.Extras) + } + if d.EnvironmentMarker != "" { + t.AddAttr(dep.Environment, d.EnvironmentMarker) + } + result = append(result, RequirementVersion{ + VersionKey: VersionKey{ + PackageKey: PackageKey{ + System: PyPI, + Name: d.ProjectName, + }, + VersionType: Requirement, + Version: d.VersionSpecifier, + }, + Type: t, + }) + } + return result, nil +} + func (a *APIClient) MatchingVersions(ctx context.Context, vk VersionKey) ([]Version, error) { if isNPMBundle(vk.Name) { bv, ok := a.getBundledVersion(vk.Name) diff --git a/util/resolve/api_test.go b/util/resolve/api_test.go index c769f2d7..f9565fe1 100644 --- a/util/resolve/api_test.go +++ b/util/resolve/api_test.go @@ -262,3 +262,67 @@ func TestNPMDependencies(t *testing.T) { } } } + +func TestPyPIRequirements(t *testing.T) { + req := func(name, version, typ string) RequirementVersion { + dt, err := deptest.ParseString(typ) + if err != nil { + t.Fatal(err) + } + return RequirementVersion{ + VersionKey: VersionKey{ + PackageKey: PackageKey{ + System: PyPI, + Name: name, + }, + VersionType: Requirement, + Version: version, + }, + Type: dt, + } + } + + for _, c := range []struct { + in *pb.Requirements_PyPI + out []RequirementVersion + }{{ + in: &pb.Requirements_PyPI{}, + out: nil, + }, { + in: &pb.Requirements_PyPI{ + Dependencies: []*pb.Requirements_PyPI_Dependency{{ + ProjectName: "regular", + VersionSpecifier: "==1.0.0", + }, { + ProjectName: "with-extras", + VersionSpecifier: "==2.0.0", + Extras: "extra1,extra2", + }, { + ProjectName: "with-marker", + VersionSpecifier: "==3.0.0", + EnvironmentMarker: "python_version < '3'", + }, { + ProjectName: "with-both", + VersionSpecifier: "==4.0.0", + Extras: "extra3", + EnvironmentMarker: "os_name == 'nt'", + }}, + }, + out: []RequirementVersion{ + req("regular", "==1.0.0", ""), + req("with-extras", "==2.0.0", "EnabledDependencies extra1,extra2"), + req("with-marker", "==3.0.0", "Environment \"python_version < '3'\""), + req("with-both", "==4.0.0", "EnabledDependencies extra3 Environment \"os_name == 'nt'\""), + }, + }} { + client := APIClient{} + got, err := client.pypiRequirements(c.in) + if err != nil { + t.Errorf("pypiRequirements(%v): %v", c.in, err) + continue + } + if d := cmp.Diff(c.out, got); d != "" { + t.Errorf("pypiRequirements(%v):\n(- want, + got):\n%s", c.in, d) + } + } +} diff --git a/util/resolve/go.mod b/util/resolve/go.mod index 0c48dd9e..791780ca 100644 --- a/util/resolve/go.mod +++ b/util/resolve/go.mod @@ -9,7 +9,7 @@ replace ( ) require ( - deps.dev/api/v3 v3.0.0-20240311054650-e1e6a3d70fb7 + deps.dev/api/v3 v3.0.0-20260225062937-bb3cf65ba738 deps.dev/util/maven v0.0.0-20240322043601-ff53416fec6a deps.dev/util/pypi v0.0.0-20250307021655-d811e36f9cad deps.dev/util/semver v0.0.0-20241230231135-52b7655a522f diff --git a/util/resolve/go.sum b/util/resolve/go.sum index e9484973..5709241b 100644 --- a/util/resolve/go.sum +++ b/util/resolve/go.sum @@ -1,5 +1,5 @@ -deps.dev/api/v3 v3.0.0-20240311054650-e1e6a3d70fb7 h1:dleK4xoNCfxlfknQNPR1DmSdVErIAWlEzxtTImCqWXI= -deps.dev/api/v3 v3.0.0-20240311054650-e1e6a3d70fb7/go.mod h1:k3RHZwAw7ijqoXmVDvcO7ikeTwTC4jtmhCDathV+IKE= +deps.dev/api/v3 v3.0.0-20260225062937-bb3cf65ba738 h1:901QBvj0xb8eVAQMHXsAyw4gWrt1wLFJSw6D2vnbq4g= +deps.dev/api/v3 v3.0.0-20260225062937-bb3cf65ba738/go.mod h1:+gN+ydvfcDk/mTxWon7Ze4X8gYN/HZxUdt54XWgWcRQ= github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= From dbc91373cdb99ae8352d53aac5c1492180833028 Mon Sep 17 00:00:00 2001 From: Xueqin Cui Date: Wed, 25 Feb 2026 17:58:42 +1100 Subject: [PATCH 2/2] go mod tidy --- examples/go/resolve/go.mod | 2 +- examples/go/resolve/go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/go/resolve/go.mod b/examples/go/resolve/go.mod index 28aaa653..f6a9a392 100644 --- a/examples/go/resolve/go.mod +++ b/examples/go/resolve/go.mod @@ -9,7 +9,7 @@ replace ( ) require ( - deps.dev/api/v3 v3.0.0-20240311054650-e1e6a3d70fb7 + deps.dev/api/v3 v3.0.0-20260225062937-bb3cf65ba738 deps.dev/util/resolve v0.0.0-20240312000934-38ffc8dd1d92 google.golang.org/grpc v1.78.0 ) diff --git a/examples/go/resolve/go.sum b/examples/go/resolve/go.sum index a997b4f0..4f58ca6b 100644 --- a/examples/go/resolve/go.sum +++ b/examples/go/resolve/go.sum @@ -1,5 +1,5 @@ -deps.dev/api/v3 v3.0.0-20240311054650-e1e6a3d70fb7 h1:dleK4xoNCfxlfknQNPR1DmSdVErIAWlEzxtTImCqWXI= -deps.dev/api/v3 v3.0.0-20240311054650-e1e6a3d70fb7/go.mod h1:k3RHZwAw7ijqoXmVDvcO7ikeTwTC4jtmhCDathV+IKE= +deps.dev/api/v3 v3.0.0-20260225062937-bb3cf65ba738 h1:901QBvj0xb8eVAQMHXsAyw4gWrt1wLFJSw6D2vnbq4g= +deps.dev/api/v3 v3.0.0-20260225062937-bb3cf65ba738/go.mod h1:+gN+ydvfcDk/mTxWon7Ze4X8gYN/HZxUdt54XWgWcRQ= github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=