From 74244c710803559b4f2ddf13a09462167f0a9253 Mon Sep 17 00:00:00 2001 From: Samuel Gaist Date: Sat, 21 Feb 2026 15:31:05 +0100 Subject: [PATCH 1/4] refactor: move build and sbom in own modules Move them at the same level as installer. This removes the common module and all the duplicates present around. --- build.go | 4 +- build_test.go | 23 +++++------ detect_test.go | 26 ++++++------- .../common/common.go => build/build.go} | 17 ++------- pkg/packagers/conda/build.go | 5 +-- pkg/packagers/conda/build_test.go | 37 +++++++++--------- pkg/packagers/conda/detect.go | 4 +- pkg/packagers/conda/detect_test.go | 6 +-- pkg/packagers/pip/build.go | 5 +-- pkg/packagers/pip/build_test.go | 31 +++++++-------- pkg/packagers/pip/detect.go | 8 ++-- pkg/packagers/pip/detect_test.go | 20 +++++----- pkg/packagers/pip/fakes/sbom_generator.go | 37 ------------------ pkg/packagers/pipenv/build.go | 5 +-- pkg/packagers/pipenv/build_test.go | 31 +++++++-------- pkg/packagers/pipenv/detect.go | 12 +++--- pkg/packagers/pipenv/detect_test.go | 8 ++-- pkg/packagers/pipenv/fakes/sbom_generator.go | 37 ------------------ pkg/packagers/pixi/build.go | 9 +---- pkg/packagers/pixi/build_test.go | 37 +++++++++--------- pkg/packagers/pixi/detect.go | 4 +- pkg/packagers/pixi/detect_test.go | 6 +-- pkg/packagers/pixi/fakes/sbom_generator.go | 38 ------------------- pkg/packagers/poetry/build.go | 5 +-- pkg/packagers/poetry/build_test.go | 31 +++++++-------- pkg/packagers/poetry/detect.go | 6 +-- pkg/packagers/poetry/detect_test.go | 6 +-- pkg/packagers/poetry/fakes/sbom_generator.go | 37 ------------------ pkg/packagers/uv/build.go | 5 +-- pkg/packagers/uv/build_test.go | 37 +++++++++--------- pkg/packagers/uv/detect.go | 6 +-- pkg/packagers/uv/detect_test.go | 4 +- pkg/packagers/uv/fakes/sbom_generator.go | 37 ------------------ .../conda => sbom}/fakes/sbom_generator.go | 0 pkg/sbom/sbom.go | 22 +++++++++++ run/main.go | 7 ++-- 36 files changed, 219 insertions(+), 394 deletions(-) rename pkg/{packagers/common/common.go => build/build.go} (77%) delete mode 100644 pkg/packagers/pip/fakes/sbom_generator.go delete mode 100644 pkg/packagers/pipenv/fakes/sbom_generator.go delete mode 100644 pkg/packagers/pixi/fakes/sbom_generator.go delete mode 100644 pkg/packagers/poetry/fakes/sbom_generator.go delete mode 100644 pkg/packagers/uv/fakes/sbom_generator.go rename pkg/{packagers/conda => sbom}/fakes/sbom_generator.go (100%) create mode 100644 pkg/sbom/sbom.go diff --git a/build.go b/build.go index 25a8a7b2..6ba900ef 100644 --- a/build.go +++ b/build.go @@ -16,7 +16,7 @@ import ( poetryinstall "github.com/paketo-buildpacks/python-packagers/pkg/packagers/poetry" uvinstall "github.com/paketo-buildpacks/python-packagers/pkg/packagers/uv" - pythonpackagers "github.com/paketo-buildpacks/python-packagers/pkg/packagers/common" + "github.com/paketo-buildpacks/python-packagers/pkg/build" ) // filtered returns the slice passed in parameter with the needle removed @@ -37,7 +37,7 @@ type PackagerParameters interface { func Build( logger scribe.Emitter, - commonBuildParameters pythonpackagers.CommonBuildParameters, + commonBuildParameters build.CommonBuildParameters, buildParameters map[string]PackagerParameters, ) packit.BuildFunc { return func(context packit.BuildContext) (packit.BuildResult, error) { diff --git a/build_test.go b/build_test.go index d9fdd8a6..c7a38bac 100644 --- a/build_test.go +++ b/build_test.go @@ -17,7 +17,7 @@ import ( "github.com/paketo-buildpacks/packit/v2/scribe" pythonpackagers "github.com/paketo-buildpacks/python-packagers" - pkgcommon "github.com/paketo-buildpacks/python-packagers/pkg/packagers/common" + "github.com/paketo-buildpacks/python-packagers/pkg/build" conda "github.com/paketo-buildpacks/python-packagers/pkg/packagers/conda" condafakes "github.com/paketo-buildpacks/python-packagers/pkg/packagers/conda/fakes" pipinstall "github.com/paketo-buildpacks/python-packagers/pkg/packagers/pip" @@ -28,6 +28,7 @@ import ( poetryfakes "github.com/paketo-buildpacks/python-packagers/pkg/packagers/poetry/fakes" uvinstall "github.com/paketo-buildpacks/python-packagers/pkg/packagers/uv" uvfakes "github.com/paketo-buildpacks/python-packagers/pkg/packagers/uv/fakes" + sbomfakes "github.com/paketo-buildpacks/python-packagers/pkg/sbom/fakes" "github.com/sclevine/spec" @@ -44,11 +45,11 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { buffer *bytes.Buffer logger scribe.Emitter - build packit.BuildFunc + buildFunc packit.BuildFunc buildContext packit.BuildContext // common - sbomGenerator *pipfakes.SBOMGenerator + sbomGenerator *sbomfakes.SBOMGenerator // conda runner *condafakes.Runner @@ -70,7 +71,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { // uv uvRunner *uvfakes.Runner - buildParameters pkgcommon.CommonBuildParameters + buildParameters build.CommonBuildParameters plans []packit.BuildpackPlan ) @@ -83,7 +84,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { buffer = bytes.NewBuffer(nil) logger = scribe.NewEmitter(buffer) - sbomGenerator = &pipfakes.SBOMGenerator{} + sbomGenerator = &sbomfakes.SBOMGenerator{} sbomGenerator.GenerateCall.Returns.SBOM = sbom.SBOM{} // conda @@ -113,8 +114,8 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { // uv uvRunner = &uvfakes.Runner{} - buildParameters = pkgcommon.CommonBuildParameters{ - SbomGenerator: pkgcommon.Generator{}, + buildParameters = build.CommonBuildParameters{ + SbomGenerator: sbomGenerator, Clock: chronos.DefaultClock, Logger: logger, } @@ -142,7 +143,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }, } - build = pythonpackagers.Build(logger, buildParameters, packagerParameters) + buildFunc = pythonpackagers.Build(logger, buildParameters, packagerParameters) buildContext = packit.BuildContext{ BuildpackInfo: packit.BuildpackInfo{ @@ -221,7 +222,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { it("runs the build process and returns expected layers", func() { for _, plan := range plans { buildContext.Plan = plan - result, err := build(buildContext) + result, err := buildFunc(buildContext) Expect(err).NotTo(HaveOccurred()) layers := result.Layers @@ -232,11 +233,11 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { it("fails if packager parameters is missing", func() { packagerParameters := map[string]pythonpackagers.PackagerParameters{} - build = pythonpackagers.Build(logger, buildParameters, packagerParameters) + buildFunc = pythonpackagers.Build(logger, buildParameters, packagerParameters) for _, plan := range plans { buildContext.Plan = plan - _, err := build(buildContext) + _, err := buildFunc(buildContext) Expect(err).To(HaveOccurred()) } }) diff --git a/detect_test.go b/detect_test.go index 1f0e0120..6b34b133 100644 --- a/detect_test.go +++ b/detect_test.go @@ -14,7 +14,7 @@ import ( "github.com/paketo-buildpacks/packit/v2" "github.com/paketo-buildpacks/packit/v2/scribe" pythonpackagers "github.com/paketo-buildpacks/python-packagers" - common "github.com/paketo-buildpacks/python-packagers/pkg/packagers/common" + "github.com/paketo-buildpacks/python-packagers/pkg/build" conda "github.com/paketo-buildpacks/python-packagers/pkg/packagers/conda" pip "github.com/paketo-buildpacks/python-packagers/pkg/packagers/pip" pipenv "github.com/paketo-buildpacks/python-packagers/pkg/packagers/pipenv" @@ -72,7 +72,7 @@ func testDetect(t *testing.T, context spec.G, it spec.S) { Requires: []packit.BuildPlanRequirement{ { Name: conda.CondaPlanEntry, - Metadata: common.BuildPlanMetadata{ + Metadata: build.BuildPlanMetadata{ Build: true, }, }, @@ -102,7 +102,7 @@ func testDetect(t *testing.T, context spec.G, it spec.S) { Requires: []packit.BuildPlanRequirement{ { Name: conda.CondaPlanEntry, - Metadata: common.BuildPlanMetadata{ + Metadata: build.BuildPlanMetadata{ Build: true, }, }, @@ -134,19 +134,19 @@ func testDetect(t *testing.T, context spec.G, it spec.S) { Requires: []packit.BuildPlanRequirement{ { Name: pip.CPython, - Metadata: common.BuildPlanMetadata{ + Metadata: build.BuildPlanMetadata{ Build: true, }, }, { Name: pip.Pip, - Metadata: common.BuildPlanMetadata{ + Metadata: build.BuildPlanMetadata{ Build: true, }, }, { Name: pip.Manager, - Metadata: common.BuildPlanMetadata{ + Metadata: build.BuildPlanMetadata{ Build: true, }, }, @@ -178,19 +178,19 @@ func testDetect(t *testing.T, context spec.G, it spec.S) { Requires: []packit.BuildPlanRequirement{ { Name: pipenv.CPython, - Metadata: common.BuildPlanMetadata{ + Metadata: build.BuildPlanMetadata{ Build: true, }, }, { Name: pipenv.Pipenv, - Metadata: common.BuildPlanMetadata{ + Metadata: build.BuildPlanMetadata{ Build: true, }, }, { Name: pipenv.Manager, - Metadata: common.BuildPlanMetadata{ + Metadata: build.BuildPlanMetadata{ Build: true, }, }, @@ -219,13 +219,13 @@ func testDetect(t *testing.T, context spec.G, it spec.S) { Requires: []packit.BuildPlanRequirement{ { Name: poetry.CPython, - Metadata: common.BuildPlanMetadata{ + Metadata: build.BuildPlanMetadata{ Build: true, }, }, { Name: poetry.Poetry, - Metadata: common.BuildPlanMetadata{ + Metadata: build.BuildPlanMetadata{ Build: true, }, }, @@ -255,7 +255,7 @@ func testDetect(t *testing.T, context spec.G, it spec.S) { Requires: []packit.BuildPlanRequirement{ { Name: uv.UvPlanEntry, - Metadata: common.BuildPlanMetadata{ + Metadata: build.BuildPlanMetadata{ Build: true, }, }, @@ -290,7 +290,7 @@ func testDetect(t *testing.T, context spec.G, it spec.S) { Requires: []packit.BuildPlanRequirement{ { Name: uv.UvPlanEntry, - Metadata: common.BuildPlanMetadata{ + Metadata: build.BuildPlanMetadata{ Build: true, }, }, diff --git a/pkg/packagers/common/common.go b/pkg/build/build.go similarity index 77% rename from pkg/packagers/common/common.go rename to pkg/build/build.go index 8cbcdd4c..b24fccc1 100644 --- a/pkg/packagers/common/common.go +++ b/pkg/build/build.go @@ -3,23 +3,14 @@ // // SPDX-License-Identifier: Apache-2.0 -package pythonpackagers +package build import ( "github.com/paketo-buildpacks/packit/v2/chronos" - "github.com/paketo-buildpacks/packit/v2/sbom" "github.com/paketo-buildpacks/packit/v2/scribe" -) - -type SBOMGenerator interface { - Generate(dir string) (sbom.SBOM, error) -} -type Generator struct{} - -func (f Generator) Generate(dir string) (sbom.SBOM, error) { - return sbom.Generate(dir) -} + "github.com/paketo-buildpacks/python-packagers/pkg/sbom" +) // BuildPlanMetadata is the buildpack-specific data included in build plan // requirements. @@ -37,7 +28,7 @@ type BuildPlanMetadata struct { // CommonBuildParameters are the parameters shared // by all packager build function implementation type CommonBuildParameters struct { - SbomGenerator SBOMGenerator + SbomGenerator sbom.SBOMGenerator Clock chronos.Clock Logger scribe.Emitter } diff --git a/pkg/packagers/conda/build.go b/pkg/packagers/conda/build.go index 73042dfb..99350e79 100644 --- a/pkg/packagers/conda/build.go +++ b/pkg/packagers/conda/build.go @@ -13,11 +13,10 @@ import ( "github.com/paketo-buildpacks/packit/v2/fs" "github.com/paketo-buildpacks/packit/v2/sbom" - pythonpackagers "github.com/paketo-buildpacks/python-packagers/pkg/packagers/common" + "github.com/paketo-buildpacks/python-packagers/pkg/build" ) //go:generate faux --interface Runner --output fakes/runner.go -//go:generate faux --interface SBOMGenerator --output fakes/sbom_generator.go // Runner defines the interface for setting up the conda environment. type Runner interface { @@ -39,7 +38,7 @@ type CondaBuildParameters struct { // determined by the runner. func Build( buildParameters CondaBuildParameters, - parameters pythonpackagers.CommonBuildParameters, + parameters build.CommonBuildParameters, ) packit.BuildFunc { return func(context packit.BuildContext) (packit.BuildResult, error) { runner := buildParameters.Runner diff --git a/pkg/packagers/conda/build_test.go b/pkg/packagers/conda/build_test.go index 7ea28282..e25c2e97 100644 --- a/pkg/packagers/conda/build_test.go +++ b/pkg/packagers/conda/build_test.go @@ -17,9 +17,10 @@ import ( "github.com/paketo-buildpacks/packit/v2/scribe" "github.com/sclevine/spec" - pythonpackagers "github.com/paketo-buildpacks/python-packagers/pkg/packagers/common" + "github.com/paketo-buildpacks/python-packagers/pkg/build" condaenvupdate "github.com/paketo-buildpacks/python-packagers/pkg/packagers/conda" "github.com/paketo-buildpacks/python-packagers/pkg/packagers/conda/fakes" + sbomfakes "github.com/paketo-buildpacks/python-packagers/pkg/sbom/fakes" . "github.com/onsi/gomega" ) @@ -35,9 +36,9 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { buffer *bytes.Buffer runner *fakes.Runner - sbomGenerator *fakes.SBOMGenerator + sbomGenerator *sbomfakes.SBOMGenerator - build packit.BuildFunc + buildFunc packit.BuildFunc buildContext packit.BuildContext ) @@ -53,7 +54,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { Expect(err).NotTo(HaveOccurred()) runner = &fakes.Runner{} - sbomGenerator = &fakes.SBOMGenerator{} + sbomGenerator = &sbomfakes.SBOMGenerator{} runner.ShouldRunCall.Returns.Bool = true runner.ShouldRunCall.Returns.String = "some-sha" @@ -63,11 +64,11 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { buffer = bytes.NewBuffer(nil) logger := scribe.NewEmitter(buffer) - build = condaenvupdate.Build( + buildFunc = condaenvupdate.Build( condaenvupdate.CondaBuildParameters{ runner, }, - pythonpackagers.CommonBuildParameters{ + build.CommonBuildParameters{ SbomGenerator: sbomGenerator, Clock: chronos.DefaultClock, Logger: logger, @@ -101,7 +102,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("returns a result that builds correctly", func() { - result, err := build(buildContext) + result, err := buildFunc(buildContext) Expect(err).NotTo(HaveOccurred()) layers := result.Layers @@ -151,7 +152,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("cache layer is exported", func() { - result, err := build(buildContext) + result, err := buildFunc(buildContext) Expect(err).NotTo(HaveOccurred()) layers := result.Layers @@ -178,7 +179,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("assigns the flag to the conda env layer", func() { - result, err := build(buildContext) + result, err := buildFunc(buildContext) Expect(err).NotTo(HaveOccurred()) layers := result.Layers @@ -201,7 +202,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("assigns build and cache to the conda env layer", func() { - result, err := build(buildContext) + result, err := buildFunc(buildContext) Expect(err).NotTo(HaveOccurred()) layers := result.Layers @@ -223,7 +224,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("reuses cached conda env layer instead of running build process", func() { - result, err := build(buildContext) + result, err := buildFunc(buildContext) Expect(err).NotTo(HaveOccurred()) layers := result.Layers @@ -243,7 +244,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("returns an error", func() { - _, err := build(buildContext) + _, err := buildFunc(buildContext) Expect(err).To(MatchError(ContainSubstring("permission denied"))) }) }) @@ -254,7 +255,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("returns an error", func() { - _, err := build(buildContext) + _, err := buildFunc(buildContext) Expect(err).To(MatchError(ContainSubstring("permission denied"))) }) }) @@ -265,7 +266,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("returns an error", func() { - _, err := build(buildContext) + _, err := buildFunc(buildContext) Expect(err).To(MatchError("some-shouldrun-error")) }) }) @@ -281,7 +282,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("returns an error", func() { - _, err := build(buildContext) + _, err := buildFunc(buildContext) Expect(err).To(MatchError(ContainSubstring("error could not create directory"))) }) }) @@ -293,7 +294,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("returns an error", func() { - _, err := build(buildContext) + _, err := buildFunc(buildContext) Expect(err).To(MatchError(ContainSubstring("some execution error"))) }) }) @@ -304,7 +305,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("returns an error", func() { - _, err := build(buildContext) + _, err := buildFunc(buildContext) Expect(err).To(MatchError(`unsupported SBOM format: 'random-format'`)) }) }) @@ -315,7 +316,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("returns an error", func() { - _, err := build(buildContext) + _, err := buildFunc(buildContext) Expect(err).To(MatchError(ContainSubstring("failed to generate SBOM"))) }) }) diff --git a/pkg/packagers/conda/detect.go b/pkg/packagers/conda/detect.go index cfb3a364..e9a45a31 100644 --- a/pkg/packagers/conda/detect.go +++ b/pkg/packagers/conda/detect.go @@ -10,7 +10,7 @@ import ( "github.com/paketo-buildpacks/packit/v2" "github.com/paketo-buildpacks/packit/v2/fs" - common "github.com/paketo-buildpacks/python-packagers/pkg/packagers/common" + "github.com/paketo-buildpacks/python-packagers/pkg/build" ) // Detect returns a packit.DetectFunc that will be invoked during the @@ -42,7 +42,7 @@ func Detect() packit.DetectFunc { Requires: []packit.BuildPlanRequirement{ { Name: CondaPlanEntry, - Metadata: common.BuildPlanMetadata{ + Metadata: build.BuildPlanMetadata{ Build: true, }, }, diff --git a/pkg/packagers/conda/detect_test.go b/pkg/packagers/conda/detect_test.go index 36abd4e6..fedafbbb 100644 --- a/pkg/packagers/conda/detect_test.go +++ b/pkg/packagers/conda/detect_test.go @@ -14,7 +14,7 @@ import ( . "github.com/onsi/gomega" - common "github.com/paketo-buildpacks/python-packagers/pkg/packagers/common" + "github.com/paketo-buildpacks/python-packagers/pkg/build" condaenvupdate "github.com/paketo-buildpacks/python-packagers/pkg/packagers/conda" ) @@ -58,7 +58,7 @@ func testDetect(t *testing.T, context spec.G, it spec.S) { Requires: []packit.BuildPlanRequirement{ { Name: "conda", - Metadata: common.BuildPlanMetadata{ + Metadata: build.BuildPlanMetadata{ Build: true, }, }, @@ -87,7 +87,7 @@ func testDetect(t *testing.T, context spec.G, it spec.S) { Requires: []packit.BuildPlanRequirement{ { Name: "conda", - Metadata: common.BuildPlanMetadata{ + Metadata: build.BuildPlanMetadata{ Build: true, }, }, diff --git a/pkg/packagers/pip/build.go b/pkg/packagers/pip/build.go index da7c81e5..bb707b1b 100644 --- a/pkg/packagers/pip/build.go +++ b/pkg/packagers/pip/build.go @@ -13,13 +13,12 @@ import ( "github.com/paketo-buildpacks/packit/v2/fs" "github.com/paketo-buildpacks/packit/v2/sbom" - pythonpackagers "github.com/paketo-buildpacks/python-packagers/pkg/packagers/common" + "github.com/paketo-buildpacks/python-packagers/pkg/build" ) //go:generate faux --interface EntryResolver --output fakes/entry_resolver.go //go:generate faux --interface InstallProcess --output fakes/install_process.go //go:generate faux --interface SitePackagesProcess --output fakes/site_packages_process.go -//go:generate faux --interface SBOMGenerator --output fakes/sbom_generator.go // EntryResolver defines the interface for picking the most relevant entry from // the Buildpack Plan entries. @@ -52,7 +51,7 @@ type PipBuildParameters struct { // cache. func Build( buildParameters PipBuildParameters, - parameters pythonpackagers.CommonBuildParameters, + parameters build.CommonBuildParameters, ) packit.BuildFunc { return func(context packit.BuildContext) (packit.BuildResult, error) { installProcess := buildParameters.InstallProcess diff --git a/pkg/packagers/pip/build_test.go b/pkg/packagers/pip/build_test.go index c73501ca..6559f149 100644 --- a/pkg/packagers/pip/build_test.go +++ b/pkg/packagers/pip/build_test.go @@ -17,9 +17,10 @@ import ( "github.com/paketo-buildpacks/packit/v2/scribe" "github.com/sclevine/spec" - pythonpackagers "github.com/paketo-buildpacks/python-packagers/pkg/packagers/common" + "github.com/paketo-buildpacks/python-packagers/pkg/build" pipinstall "github.com/paketo-buildpacks/python-packagers/pkg/packagers/pip" "github.com/paketo-buildpacks/python-packagers/pkg/packagers/pip/fakes" + sbomfakes "github.com/paketo-buildpacks/python-packagers/pkg/sbom/fakes" . "github.com/onsi/gomega" ) @@ -34,11 +35,11 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { installProcess *fakes.InstallProcess sitePackagesProcess *fakes.SitePackagesProcess - sbomGenerator *fakes.SBOMGenerator + sbomGenerator *sbomfakes.SBOMGenerator buffer *bytes.Buffer - build packit.BuildFunc + buildFunc packit.BuildFunc buildContext packit.BuildContext ) @@ -51,17 +52,17 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { sitePackagesProcess = &fakes.SitePackagesProcess{} sitePackagesProcess.ExecuteCall.Returns.SitePackagesPath = "some-site-packages-path" - sbomGenerator = &fakes.SBOMGenerator{} + sbomGenerator = &sbomfakes.SBOMGenerator{} sbomGenerator.GenerateCall.Returns.SBOM = sbom.SBOM{} buffer = bytes.NewBuffer(nil) - build = pipinstall.Build( + buildFunc = pipinstall.Build( pipinstall.PipBuildParameters{ installProcess, sitePackagesProcess, }, - pythonpackagers.CommonBuildParameters{ + build.CommonBuildParameters{ SbomGenerator: sbomGenerator, Clock: chronos.DefaultClock, Logger: scribe.NewEmitter(buffer), @@ -91,7 +92,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("runs the build process and returns expected layers", func() { - result, err := build(buildContext) + result, err := buildFunc(buildContext) Expect(err).NotTo(HaveOccurred()) layers := result.Layers @@ -139,7 +140,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("layer's build, launch, cache flags must be set", func() { - result, err := build(buildContext) + result, err := buildFunc(buildContext) Expect(err).NotTo(HaveOccurred()) Expect(result.Layers).To(HaveLen(1)) @@ -160,7 +161,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("layer's build, cache flags must be set", func() { - result, err := build(buildContext) + result, err := buildFunc(buildContext) Expect(err).NotTo(HaveOccurred()) Expect(result.Layers).To(HaveLen(1)) @@ -185,7 +186,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("result should include a cache layer", func() { - result, err := build(buildContext) + result, err := buildFunc(buildContext) Expect(err).NotTo(HaveOccurred()) Expect(result.Layers).To(HaveLen(2)) @@ -219,7 +220,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("returns an error", func() { - _, err := build(buildContext) + _, err := buildFunc(buildContext) Expect(err).To(MatchError(ContainSubstring("permission denied"))) }) }) @@ -230,7 +231,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("returns an error", func() { - _, err := build(buildContext) + _, err := buildFunc(buildContext) Expect(err).To(MatchError("could not run install process")) }) }) @@ -241,7 +242,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("returns an error", func() { - _, err := build(buildContext) + _, err := buildFunc(buildContext) Expect(err).To(MatchError("could not find site-packages path")) }) }) @@ -252,7 +253,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("returns an error", func() { - _, err := build(buildContext) + _, err := buildFunc(buildContext) Expect(err).To(MatchError(`unsupported SBOM format: 'random-format'`)) }) }) @@ -263,7 +264,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("returns an error", func() { - _, err := build(buildContext) + _, err := buildFunc(buildContext) Expect(err).To(MatchError(ContainSubstring("failed to generate SBOM"))) }) }) diff --git a/pkg/packagers/pip/detect.go b/pkg/packagers/pip/detect.go index c9b3c689..1aba91c4 100644 --- a/pkg/packagers/pip/detect.go +++ b/pkg/packagers/pip/detect.go @@ -12,7 +12,7 @@ import ( "github.com/paketo-buildpacks/packit/v2" "github.com/paketo-buildpacks/packit/v2/fs" - common "github.com/paketo-buildpacks/python-packagers/pkg/packagers/common" + "github.com/paketo-buildpacks/python-packagers/pkg/build" ) // Detect will return a packit.DetectFunc that will be invoked during the @@ -58,19 +58,19 @@ func Detect() packit.DetectFunc { Requires: []packit.BuildPlanRequirement{ { Name: CPython, - Metadata: common.BuildPlanMetadata{ + Metadata: build.BuildPlanMetadata{ Build: true, }, }, { Name: Pip, - Metadata: common.BuildPlanMetadata{ + Metadata: build.BuildPlanMetadata{ Build: true, }, }, { Name: Manager, - Metadata: common.BuildPlanMetadata{ + Metadata: build.BuildPlanMetadata{ Build: true, }, }, diff --git a/pkg/packagers/pip/detect_test.go b/pkg/packagers/pip/detect_test.go index 68dea947..c31c4d2f 100644 --- a/pkg/packagers/pip/detect_test.go +++ b/pkg/packagers/pip/detect_test.go @@ -14,7 +14,7 @@ import ( . "github.com/onsi/gomega" - common "github.com/paketo-buildpacks/python-packagers/pkg/packagers/common" + "github.com/paketo-buildpacks/python-packagers/pkg/build" pipinstall "github.com/paketo-buildpacks/python-packagers/pkg/packagers/pip" ) @@ -49,19 +49,19 @@ func testDetect(t *testing.T, context spec.G, it spec.S) { Requires: []packit.BuildPlanRequirement{ { Name: pipinstall.CPython, - Metadata: common.BuildPlanMetadata{ + Metadata: build.BuildPlanMetadata{ Build: true, }, }, { Name: pipinstall.Pip, - Metadata: common.BuildPlanMetadata{ + Metadata: build.BuildPlanMetadata{ Build: true, }, }, { Name: pipinstall.Manager, - Metadata: common.BuildPlanMetadata{ + Metadata: build.BuildPlanMetadata{ Build: true, }, }, @@ -94,19 +94,19 @@ func testDetect(t *testing.T, context spec.G, it spec.S) { Requires: []packit.BuildPlanRequirement{ { Name: pipinstall.CPython, - Metadata: common.BuildPlanMetadata{ + Metadata: build.BuildPlanMetadata{ Build: true, }, }, { Name: pipinstall.Pip, - Metadata: common.BuildPlanMetadata{ + Metadata: build.BuildPlanMetadata{ Build: true, }, }, { Name: pipinstall.Manager, - Metadata: common.BuildPlanMetadata{ + Metadata: build.BuildPlanMetadata{ Build: true, }, }, @@ -152,19 +152,19 @@ func testDetect(t *testing.T, context spec.G, it spec.S) { Requires: []packit.BuildPlanRequirement{ { Name: pipinstall.CPython, - Metadata: common.BuildPlanMetadata{ + Metadata: build.BuildPlanMetadata{ Build: true, }, }, { Name: pipinstall.Pip, - Metadata: common.BuildPlanMetadata{ + Metadata: build.BuildPlanMetadata{ Build: true, }, }, { Name: pipinstall.Manager, - Metadata: common.BuildPlanMetadata{ + Metadata: build.BuildPlanMetadata{ Build: true, }, }, diff --git a/pkg/packagers/pip/fakes/sbom_generator.go b/pkg/packagers/pip/fakes/sbom_generator.go deleted file mode 100644 index 9897b0d6..00000000 --- a/pkg/packagers/pip/fakes/sbom_generator.go +++ /dev/null @@ -1,37 +0,0 @@ -// SPDX-FileCopyrightText: Copyright (c) 2013-Present CloudFoundry.org Foundation, Inc. All Rights Reserved. -// -// SPDX-License-Identifier: Apache-2.0 - -package fakes - -import ( - "sync" - - "github.com/paketo-buildpacks/packit/v2/sbom" -) - -type SBOMGenerator struct { - GenerateCall struct { - mutex sync.Mutex - CallCount int - Receives struct { - Dir string - } - Returns struct { - SBOM sbom.SBOM - Error error - } - Stub func(string) (sbom.SBOM, error) - } -} - -func (f *SBOMGenerator) Generate(param1 string) (sbom.SBOM, error) { - f.GenerateCall.mutex.Lock() - defer f.GenerateCall.mutex.Unlock() - f.GenerateCall.CallCount++ - f.GenerateCall.Receives.Dir = param1 - if f.GenerateCall.Stub != nil { - return f.GenerateCall.Stub(param1) - } - return f.GenerateCall.Returns.SBOM, f.GenerateCall.Returns.Error -} diff --git a/pkg/packagers/pipenv/build.go b/pkg/packagers/pipenv/build.go index ff324c7f..0f65ef15 100644 --- a/pkg/packagers/pipenv/build.go +++ b/pkg/packagers/pipenv/build.go @@ -14,13 +14,12 @@ import ( "github.com/paketo-buildpacks/packit/v2/fs" "github.com/paketo-buildpacks/packit/v2/sbom" - pythonpackagers "github.com/paketo-buildpacks/python-packagers/pkg/packagers/common" + "github.com/paketo-buildpacks/python-packagers/pkg/build" ) //go:generate faux --interface InstallProcess --output fakes/install_process.go //go:generate faux --interface SitePackagesProcess --output fakes/site_packages_process.go //go:generate faux --interface VenvDirLocator --output fakes/venv_dir_locator.go -//go:generate faux --interface SBOMGenerator --output fakes/sbom_generator.go // SitePackagesProcess defines the interface for determining the site-packages path. type SitePackagesProcess interface { @@ -52,7 +51,7 @@ type PipEnvBuildParameters struct { // cache. func Build( buildParameters PipEnvBuildParameters, - parameters pythonpackagers.CommonBuildParameters, + parameters build.CommonBuildParameters, ) packit.BuildFunc { return func(context packit.BuildContext) (packit.BuildResult, error) { installProcess := buildParameters.InstallProcess diff --git a/pkg/packagers/pipenv/build_test.go b/pkg/packagers/pipenv/build_test.go index b183f5dc..c2d1a8b3 100644 --- a/pkg/packagers/pipenv/build_test.go +++ b/pkg/packagers/pipenv/build_test.go @@ -18,9 +18,10 @@ import ( "github.com/paketo-buildpacks/packit/v2/scribe" "github.com/sclevine/spec" - pythonpackagers "github.com/paketo-buildpacks/python-packagers/pkg/packagers/common" + "github.com/paketo-buildpacks/python-packagers/pkg/build" pipenvinstall "github.com/paketo-buildpacks/python-packagers/pkg/packagers/pipenv" "github.com/paketo-buildpacks/python-packagers/pkg/packagers/pipenv/fakes" + sbomfakes "github.com/paketo-buildpacks/python-packagers/pkg/sbom/fakes" . "github.com/onsi/gomega" ) @@ -39,9 +40,9 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { installProcess *fakes.InstallProcess sitePackagesProcess *fakes.SitePackagesProcess venvDirLocator *fakes.VenvDirLocator - sbomGenerator *fakes.SBOMGenerator + sbomGenerator *sbomfakes.SBOMGenerator - build packit.BuildFunc + buildFunc packit.BuildFunc buildContext packit.BuildContext ) @@ -59,7 +60,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { installProcess = &fakes.InstallProcess{} sitePackagesProcess = &fakes.SitePackagesProcess{} venvDirLocator = &fakes.VenvDirLocator{} - sbomGenerator = &fakes.SBOMGenerator{} + sbomGenerator = &sbomfakes.SBOMGenerator{} sitePackagesProcess.ExecuteCall.Returns.SitePackagesPath = "some-site-packages-path" venvDirLocator.LocateVenvDirCall.Returns.VenvDir = "some-venv-dir" @@ -68,13 +69,13 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { buffer = bytes.NewBuffer(nil) logEmitter = scribe.NewEmitter(buffer) - build = pipenvinstall.Build( + buildFunc = pipenvinstall.Build( pipenvinstall.PipEnvBuildParameters{ installProcess, sitePackagesProcess, venvDirLocator, }, - pythonpackagers.CommonBuildParameters{ + build.CommonBuildParameters{ SbomGenerator: sbomGenerator, Clock: chronos.DefaultClock, Logger: logEmitter, @@ -107,7 +108,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("runs the build process and returns expected layers", func() { - result, err := build(buildContext) + result, err := buildFunc(buildContext) Expect(err).NotTo(HaveOccurred()) layers := result.Layers @@ -157,7 +158,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("layer's build, launch, cache flags must be set", func() { - result, err := build(buildContext) + result, err := buildFunc(buildContext) Expect(err).NotTo(HaveOccurred()) layers := result.Layers @@ -188,7 +189,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("result should include a cache layer", func() { - result, err := build(buildContext) + result, err := buildFunc(buildContext) Expect(err).NotTo(HaveOccurred()) layers := result.Layers @@ -218,7 +219,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("returns an error", func() { - _, err := build(buildContext) + _, err := buildFunc(buildContext) Expect(err).To(MatchError(ContainSubstring("permission denied"))) }) }) @@ -229,7 +230,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("returns an error", func() { - _, err := build(buildContext) + _, err := buildFunc(buildContext) Expect(err).To(MatchError(ContainSubstring("some-error"))) }) }) @@ -240,7 +241,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("returns an error", func() { - _, err := build(buildContext) + _, err := buildFunc(buildContext) Expect(err).To(MatchError(ContainSubstring("some-venv-error"))) }) }) @@ -251,7 +252,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("returns an error", func() { - _, err := build(buildContext) + _, err := buildFunc(buildContext) Expect(err).To(MatchError(ContainSubstring("some-site-error"))) }) }) @@ -262,7 +263,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("returns an error", func() { - _, err := build(buildContext) + _, err := buildFunc(buildContext) Expect(err).To(MatchError(`unsupported SBOM format: 'random-format'`)) }) }) @@ -273,7 +274,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("returns an error", func() { - _, err := build(buildContext) + _, err := buildFunc(buildContext) Expect(err).To(MatchError(ContainSubstring("failed to generate SBOM"))) }) }) diff --git a/pkg/packagers/pipenv/detect.go b/pkg/packagers/pipenv/detect.go index 7a8c05ec..3328bdd8 100644 --- a/pkg/packagers/pipenv/detect.go +++ b/pkg/packagers/pipenv/detect.go @@ -12,7 +12,7 @@ import ( "github.com/paketo-buildpacks/packit/v2" "github.com/paketo-buildpacks/packit/v2/fs" - common "github.com/paketo-buildpacks/python-packagers/pkg/packagers/common" + "github.com/paketo-buildpacks/python-packagers/pkg/build" ) //go:generate faux --interface Parser --output fakes/parser.go @@ -41,7 +41,7 @@ func Detect(pipfileParser, pipfileLockParser Parser) packit.DetectFunc { cpythonRequirement := packit.BuildPlanRequirement{ Name: CPython, - Metadata: common.BuildPlanMetadata{ + Metadata: build.BuildPlanMetadata{ Build: true, }, } @@ -60,7 +60,7 @@ func Detect(pipfileParser, pipfileLockParser Parser) packit.DetectFunc { } if cpythonVersion != "" { - cpythonRequirement.Metadata = common.BuildPlanMetadata{ + cpythonRequirement.Metadata = build.BuildPlanMetadata{ Build: true, Version: cpythonVersion, VersionSource: "Pipfile.lock", @@ -75,7 +75,7 @@ func Detect(pipfileParser, pipfileLockParser Parser) packit.DetectFunc { } if cpythonVersion != "" { - cpythonRequirement.Metadata = common.BuildPlanMetadata{ + cpythonRequirement.Metadata = build.BuildPlanMetadata{ Build: true, Version: cpythonVersion, VersionSource: "Pipfile", @@ -97,13 +97,13 @@ func Detect(pipfileParser, pipfileLockParser Parser) packit.DetectFunc { cpythonRequirement, { Name: Pipenv, - Metadata: common.BuildPlanMetadata{ + Metadata: build.BuildPlanMetadata{ Build: true, }, }, { Name: Manager, - Metadata: common.BuildPlanMetadata{ + Metadata: build.BuildPlanMetadata{ Build: true, }, }, diff --git a/pkg/packagers/pipenv/detect_test.go b/pkg/packagers/pipenv/detect_test.go index 620f8973..1cbb3dd7 100644 --- a/pkg/packagers/pipenv/detect_test.go +++ b/pkg/packagers/pipenv/detect_test.go @@ -14,7 +14,7 @@ import ( . "github.com/onsi/gomega" - common "github.com/paketo-buildpacks/python-packagers/pkg/packagers/common" + "github.com/paketo-buildpacks/python-packagers/pkg/build" pipenvinstall "github.com/paketo-buildpacks/python-packagers/pkg/packagers/pipenv" "github.com/paketo-buildpacks/python-packagers/pkg/packagers/pipenv/fakes" ) @@ -57,19 +57,19 @@ func testDetect(t *testing.T, context spec.G, it spec.S) { Requires: []packit.BuildPlanRequirement{ { Name: pipenvinstall.CPython, - Metadata: common.BuildPlanMetadata{ + Metadata: build.BuildPlanMetadata{ Build: true, }, }, { Name: pipenvinstall.Pipenv, - Metadata: common.BuildPlanMetadata{ + Metadata: build.BuildPlanMetadata{ Build: true, }, }, { Name: pipenvinstall.Manager, - Metadata: common.BuildPlanMetadata{ + Metadata: build.BuildPlanMetadata{ Build: true, }, }, diff --git a/pkg/packagers/pipenv/fakes/sbom_generator.go b/pkg/packagers/pipenv/fakes/sbom_generator.go deleted file mode 100644 index 9897b0d6..00000000 --- a/pkg/packagers/pipenv/fakes/sbom_generator.go +++ /dev/null @@ -1,37 +0,0 @@ -// SPDX-FileCopyrightText: Copyright (c) 2013-Present CloudFoundry.org Foundation, Inc. All Rights Reserved. -// -// SPDX-License-Identifier: Apache-2.0 - -package fakes - -import ( - "sync" - - "github.com/paketo-buildpacks/packit/v2/sbom" -) - -type SBOMGenerator struct { - GenerateCall struct { - mutex sync.Mutex - CallCount int - Receives struct { - Dir string - } - Returns struct { - SBOM sbom.SBOM - Error error - } - Stub func(string) (sbom.SBOM, error) - } -} - -func (f *SBOMGenerator) Generate(param1 string) (sbom.SBOM, error) { - f.GenerateCall.mutex.Lock() - defer f.GenerateCall.mutex.Unlock() - f.GenerateCall.CallCount++ - f.GenerateCall.Receives.Dir = param1 - if f.GenerateCall.Stub != nil { - return f.GenerateCall.Stub(param1) - } - return f.GenerateCall.Returns.SBOM, f.GenerateCall.Returns.Error -} diff --git a/pkg/packagers/pixi/build.go b/pkg/packagers/pixi/build.go index 41adc84a..e57fab04 100644 --- a/pkg/packagers/pixi/build.go +++ b/pkg/packagers/pixi/build.go @@ -15,11 +15,10 @@ import ( "github.com/paketo-buildpacks/packit/v2/fs" "github.com/paketo-buildpacks/packit/v2/sbom" - pythonpackagers "github.com/paketo-buildpacks/python-packagers/pkg/packagers/common" + "github.com/paketo-buildpacks/python-packagers/pkg/build" ) //go:generate faux --interface Runner --output fakes/runner.go -//go:generate faux --interface SBOMGenerator --output fakes/sbom_generator.go // Runner defines the interface for setting up the pixi environment. type Runner interface { @@ -27,10 +26,6 @@ type Runner interface { ShouldRun(workingDir string, metadata map[string]interface{}) (bool, string, error) } -type SBOMGenerator interface { - Generate(dir string) (sbom.SBOM, error) -} - // PixiBuildParameters encapsulates the pixi specific parameters for the // Build function type PixiBuildParameters struct { @@ -45,7 +40,7 @@ type PixiBuildParameters struct { // determined by the runner. func Build( buildParameters PixiBuildParameters, - parameters pythonpackagers.CommonBuildParameters, + parameters build.CommonBuildParameters, ) packit.BuildFunc { return func(context packit.BuildContext) (packit.BuildResult, error) { runner := buildParameters.Runner diff --git a/pkg/packagers/pixi/build_test.go b/pkg/packagers/pixi/build_test.go index effe4e52..d126c4e5 100644 --- a/pkg/packagers/pixi/build_test.go +++ b/pkg/packagers/pixi/build_test.go @@ -18,9 +18,10 @@ import ( "github.com/paketo-buildpacks/packit/v2/scribe" "github.com/sclevine/spec" - pythonpackagers "github.com/paketo-buildpacks/python-packagers/pkg/packagers/common" + "github.com/paketo-buildpacks/python-packagers/pkg/build" pixiinstall "github.com/paketo-buildpacks/python-packagers/pkg/packagers/pixi" "github.com/paketo-buildpacks/python-packagers/pkg/packagers/pixi/fakes" + sbomfakes "github.com/paketo-buildpacks/python-packagers/pkg/sbom/fakes" . "github.com/onsi/gomega" ) @@ -36,9 +37,9 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { buffer *bytes.Buffer runner *fakes.Runner - sbomGenerator *fakes.SBOMGenerator + sbomGenerator *sbomfakes.SBOMGenerator - build packit.BuildFunc + buildFunc packit.BuildFunc buildContext packit.BuildContext ) @@ -54,7 +55,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { Expect(err).NotTo(HaveOccurred()) runner = &fakes.Runner{} - sbomGenerator = &fakes.SBOMGenerator{} + sbomGenerator = &sbomfakes.SBOMGenerator{} runner.ShouldRunCall.Returns.Bool = true runner.ShouldRunCall.Returns.String = "some-sha" @@ -64,11 +65,11 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { buffer = bytes.NewBuffer(nil) logger := scribe.NewEmitter(buffer) - build = pixiinstall.Build( + buildFunc = pixiinstall.Build( pixiinstall.PixiBuildParameters{ runner, }, - pythonpackagers.CommonBuildParameters{ + build.CommonBuildParameters{ SbomGenerator: sbomGenerator, Clock: chronos.DefaultClock, Logger: logger, @@ -102,7 +103,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("returns a result that builds correctly", func() { - result, err := build(buildContext) + result, err := buildFunc(buildContext) Expect(err).NotTo(HaveOccurred()) layers := result.Layers @@ -155,7 +156,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("cache layer is exported", func() { - result, err := build(buildContext) + result, err := buildFunc(buildContext) Expect(err).NotTo(HaveOccurred()) layers := result.Layers @@ -182,7 +183,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("assigns the flag to the pixi env layer", func() { - result, err := build(buildContext) + result, err := buildFunc(buildContext) Expect(err).NotTo(HaveOccurred()) layers := result.Layers @@ -205,7 +206,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("assigns build and cache to the pixi env layer", func() { - result, err := build(buildContext) + result, err := buildFunc(buildContext) Expect(err).NotTo(HaveOccurred()) layers := result.Layers @@ -227,7 +228,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("reuses cached pixi env layer instead of running build process", func() { - result, err := build(buildContext) + result, err := buildFunc(buildContext) Expect(err).NotTo(HaveOccurred()) layers := result.Layers @@ -247,7 +248,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("returns an error", func() { - _, err := build(buildContext) + _, err := buildFunc(buildContext) Expect(err).To(MatchError(ContainSubstring("permission denied"))) }) }) @@ -258,7 +259,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("returns an error", func() { - _, err := build(buildContext) + _, err := buildFunc(buildContext) Expect(err).To(MatchError(ContainSubstring("permission denied"))) }) }) @@ -269,7 +270,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("returns an error", func() { - _, err := build(buildContext) + _, err := buildFunc(buildContext) Expect(err).To(MatchError("some-shouldrun-error")) }) }) @@ -285,7 +286,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("returns an error", func() { - _, err := build(buildContext) + _, err := buildFunc(buildContext) Expect(err).To(MatchError(ContainSubstring("error could not create directory"))) }) }) @@ -297,7 +298,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("returns an error", func() { - _, err := build(buildContext) + _, err := buildFunc(buildContext) Expect(err).To(MatchError(ContainSubstring("some execution error"))) }) }) @@ -308,7 +309,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("returns an error", func() { - _, err := build(buildContext) + _, err := buildFunc(buildContext) Expect(err).To(MatchError(`unsupported SBOM format: 'random-format'`)) }) }) @@ -319,7 +320,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("returns an error", func() { - _, err := build(buildContext) + _, err := buildFunc(buildContext) Expect(err).To(MatchError(ContainSubstring("failed to generate SBOM"))) }) }) diff --git a/pkg/packagers/pixi/detect.go b/pkg/packagers/pixi/detect.go index 8fc2591a..7bca3337 100644 --- a/pkg/packagers/pixi/detect.go +++ b/pkg/packagers/pixi/detect.go @@ -11,7 +11,7 @@ import ( "github.com/paketo-buildpacks/packit/v2" "github.com/paketo-buildpacks/packit/v2/fs" - common "github.com/paketo-buildpacks/python-packagers/pkg/packagers/common" + "github.com/paketo-buildpacks/python-packagers/pkg/build" ) // Detect returns a packit.DetectFunc that will be invoked during the @@ -38,7 +38,7 @@ func Detect() packit.DetectFunc { requires := []packit.BuildPlanRequirement{ { Name: PixiPlanEntry, - Metadata: common.BuildPlanMetadata{ + Metadata: build.BuildPlanMetadata{ Build: true, }, }, diff --git a/pkg/packagers/pixi/detect_test.go b/pkg/packagers/pixi/detect_test.go index e62427ae..101de1e0 100644 --- a/pkg/packagers/pixi/detect_test.go +++ b/pkg/packagers/pixi/detect_test.go @@ -15,7 +15,7 @@ import ( . "github.com/onsi/gomega" - common "github.com/paketo-buildpacks/python-packagers/pkg/packagers/common" + "github.com/paketo-buildpacks/python-packagers/pkg/build" pixiinstall "github.com/paketo-buildpacks/python-packagers/pkg/packagers/pixi" ) @@ -59,7 +59,7 @@ func testDetect(t *testing.T, context spec.G, it spec.S) { Requires: []packit.BuildPlanRequirement{ { Name: "pixi", - Metadata: common.BuildPlanMetadata{ + Metadata: build.BuildPlanMetadata{ Build: true, }, }, @@ -88,7 +88,7 @@ func testDetect(t *testing.T, context spec.G, it spec.S) { Requires: []packit.BuildPlanRequirement{ { Name: "pixi", - Metadata: common.BuildPlanMetadata{ + Metadata: build.BuildPlanMetadata{ Build: true, }, }, diff --git a/pkg/packagers/pixi/fakes/sbom_generator.go b/pkg/packagers/pixi/fakes/sbom_generator.go deleted file mode 100644 index 8e8bef4b..00000000 --- a/pkg/packagers/pixi/fakes/sbom_generator.go +++ /dev/null @@ -1,38 +0,0 @@ -// SPDX-FileCopyrightText: © 2026 Idiap Research Institute -// SPDX-FileContributor: Samuel Gaist -// -// SPDX-License-Identifier: Apache-2.0 - -package fakes - -import ( - "sync" - - "github.com/paketo-buildpacks/packit/v2/sbom" -) - -type SBOMGenerator struct { - GenerateCall struct { - mutex sync.Mutex - CallCount int - Receives struct { - Dir string - } - Returns struct { - SBOM sbom.SBOM - Error error - } - Stub func(string) (sbom.SBOM, error) - } -} - -func (f *SBOMGenerator) Generate(param1 string) (sbom.SBOM, error) { - f.GenerateCall.mutex.Lock() - defer f.GenerateCall.mutex.Unlock() - f.GenerateCall.CallCount++ - f.GenerateCall.Receives.Dir = param1 - if f.GenerateCall.Stub != nil { - return f.GenerateCall.Stub(param1) - } - return f.GenerateCall.Returns.SBOM, f.GenerateCall.Returns.Error -} diff --git a/pkg/packagers/poetry/build.go b/pkg/packagers/poetry/build.go index 7762a12e..00388a61 100644 --- a/pkg/packagers/poetry/build.go +++ b/pkg/packagers/poetry/build.go @@ -13,13 +13,12 @@ import ( "github.com/paketo-buildpacks/packit/v2/fs" "github.com/paketo-buildpacks/packit/v2/sbom" - pythonpackagers "github.com/paketo-buildpacks/python-packagers/pkg/packagers/common" + "github.com/paketo-buildpacks/python-packagers/pkg/build" ) //go:generate faux --interface EntryResolver --output fakes/entry_resolver.go //go:generate faux --interface InstallProcess --output fakes/install_process.go //go:generate faux --interface PythonPathLookupProcess --output fakes/python_path_process.go -//go:generate faux --interface SBOMGenerator --output fakes/sbom_generator.go // EntryResolver defines the interface for picking the most relevant entry from // the Buildpack Plan entries. @@ -53,7 +52,7 @@ type PoetryEnvBuildParameters struct { // to a virtual environment layer. func Build( buildParameters PoetryEnvBuildParameters, - parameters pythonpackagers.CommonBuildParameters, + parameters build.CommonBuildParameters, ) packit.BuildFunc { return func(context packit.BuildContext) (packit.BuildResult, error) { entryResolver := buildParameters.EntryResolver diff --git a/pkg/packagers/poetry/build_test.go b/pkg/packagers/poetry/build_test.go index 6795fdf5..ce369800 100644 --- a/pkg/packagers/poetry/build_test.go +++ b/pkg/packagers/poetry/build_test.go @@ -18,9 +18,10 @@ import ( "github.com/paketo-buildpacks/packit/v2/scribe" "github.com/sclevine/spec" - pythonpackagers "github.com/paketo-buildpacks/python-packagers/pkg/packagers/common" + "github.com/paketo-buildpacks/python-packagers/pkg/build" poetryinstall "github.com/paketo-buildpacks/python-packagers/pkg/packagers/poetry" "github.com/paketo-buildpacks/python-packagers/pkg/packagers/poetry/fakes" + sbomfakes "github.com/paketo-buildpacks/python-packagers/pkg/sbom/fakes" . "github.com/onsi/gomega" ) @@ -35,12 +36,12 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { entryResolver *fakes.EntryResolver installProcess *fakes.InstallProcess - sbomGenerator *fakes.SBOMGenerator + sbomGenerator *sbomfakes.SBOMGenerator pythonPathProcess *fakes.PythonPathLookupProcess buffer *bytes.Buffer - build packit.BuildFunc + buildFunc packit.BuildFunc buildContext packit.BuildContext ) @@ -63,18 +64,18 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { entryResolver = &fakes.EntryResolver{} - sbomGenerator = &fakes.SBOMGenerator{} + sbomGenerator = &sbomfakes.SBOMGenerator{} sbomGenerator.GenerateCall.Returns.SBOM = sbom.SBOM{} buffer = bytes.NewBuffer(nil) - build = poetryinstall.Build( + buildFunc = poetryinstall.Build( poetryinstall.PoetryEnvBuildParameters{ entryResolver, installProcess, pythonPathProcess, }, - pythonpackagers.CommonBuildParameters{ + build.CommonBuildParameters{ SbomGenerator: sbomGenerator, Clock: chronos.DefaultClock, Logger: scribe.NewEmitter(buffer), @@ -107,7 +108,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("runs the build process and returns expected layers", func() { - result, err := build(buildContext) + result, err := buildFunc(buildContext) Expect(err).NotTo(HaveOccurred()) layers := result.Layers @@ -163,7 +164,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("layer's build, launch, cache flags must be set", func() { - result, err := build(buildContext) + result, err := buildFunc(buildContext) Expect(err).NotTo(HaveOccurred()) layers := result.Layers @@ -185,7 +186,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("layer's build, cache flags must be set", func() { - result, err := build(buildContext) + result, err := buildFunc(buildContext) Expect(err).NotTo(HaveOccurred()) layers := result.Layers @@ -226,7 +227,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("result should include a cache layer", func() { - result, err := build(buildContext) + result, err := buildFunc(buildContext) Expect(err).NotTo(HaveOccurred()) layers := result.Layers @@ -275,7 +276,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("returns an error", func() { - _, err := build(buildContext) + _, err := buildFunc(buildContext) Expect(err).To(MatchError(ContainSubstring("permission denied"))) }) }) @@ -286,7 +287,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("returns an error", func() { - _, err := build(buildContext) + _, err := buildFunc(buildContext) Expect(err).To(MatchError("could not run install process")) }) }) @@ -297,7 +298,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("returns an error", func() { - _, err := build(buildContext) + _, err := buildFunc(buildContext) Expect(err).To(MatchError("could not run Python path process")) }) }) @@ -308,7 +309,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("returns an error", func() { - _, err := build(buildContext) + _, err := buildFunc(buildContext) Expect(err).To(MatchError(`unsupported SBOM format: 'random-format'`)) }) }) @@ -319,7 +320,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("returns an error", func() { - _, err := build(buildContext) + _, err := buildFunc(buildContext) Expect(err).To(MatchError(ContainSubstring("failed to generate SBOM"))) }) }) diff --git a/pkg/packagers/poetry/detect.go b/pkg/packagers/poetry/detect.go index 1095deda..13868e03 100644 --- a/pkg/packagers/poetry/detect.go +++ b/pkg/packagers/poetry/detect.go @@ -10,7 +10,7 @@ import ( "github.com/paketo-buildpacks/packit/v2" "github.com/paketo-buildpacks/packit/v2/fs" - common "github.com/paketo-buildpacks/python-packagers/pkg/packagers/common" + "github.com/paketo-buildpacks/python-packagers/pkg/build" ) // Detect will return a packit.DetectFunc that will be invoked during the @@ -37,13 +37,13 @@ func Detect() packit.DetectFunc { Requires: []packit.BuildPlanRequirement{ { Name: CPython, - Metadata: common.BuildPlanMetadata{ + Metadata: build.BuildPlanMetadata{ Build: true, }, }, { Name: Poetry, - Metadata: common.BuildPlanMetadata{ + Metadata: build.BuildPlanMetadata{ Build: true, }, }, diff --git a/pkg/packagers/poetry/detect_test.go b/pkg/packagers/poetry/detect_test.go index 3dce38c4..f24dd22f 100644 --- a/pkg/packagers/poetry/detect_test.go +++ b/pkg/packagers/poetry/detect_test.go @@ -15,7 +15,7 @@ import ( . "github.com/onsi/gomega" - common "github.com/paketo-buildpacks/python-packagers/pkg/packagers/common" + "github.com/paketo-buildpacks/python-packagers/pkg/build" poetryinstall "github.com/paketo-buildpacks/python-packagers/pkg/packagers/poetry" ) @@ -51,13 +51,13 @@ func testDetect(t *testing.T, context spec.G, it spec.S) { Requires: []packit.BuildPlanRequirement{ { Name: poetryinstall.CPython, - Metadata: common.BuildPlanMetadata{ + Metadata: build.BuildPlanMetadata{ Build: true, }, }, { Name: poetryinstall.Poetry, - Metadata: common.BuildPlanMetadata{ + Metadata: build.BuildPlanMetadata{ Build: true, }, }, diff --git a/pkg/packagers/poetry/fakes/sbom_generator.go b/pkg/packagers/poetry/fakes/sbom_generator.go deleted file mode 100644 index 9897b0d6..00000000 --- a/pkg/packagers/poetry/fakes/sbom_generator.go +++ /dev/null @@ -1,37 +0,0 @@ -// SPDX-FileCopyrightText: Copyright (c) 2013-Present CloudFoundry.org Foundation, Inc. All Rights Reserved. -// -// SPDX-License-Identifier: Apache-2.0 - -package fakes - -import ( - "sync" - - "github.com/paketo-buildpacks/packit/v2/sbom" -) - -type SBOMGenerator struct { - GenerateCall struct { - mutex sync.Mutex - CallCount int - Receives struct { - Dir string - } - Returns struct { - SBOM sbom.SBOM - Error error - } - Stub func(string) (sbom.SBOM, error) - } -} - -func (f *SBOMGenerator) Generate(param1 string) (sbom.SBOM, error) { - f.GenerateCall.mutex.Lock() - defer f.GenerateCall.mutex.Unlock() - f.GenerateCall.CallCount++ - f.GenerateCall.Receives.Dir = param1 - if f.GenerateCall.Stub != nil { - return f.GenerateCall.Stub(param1) - } - return f.GenerateCall.Returns.SBOM, f.GenerateCall.Returns.Error -} diff --git a/pkg/packagers/uv/build.go b/pkg/packagers/uv/build.go index 8aaf6e18..12916e42 100644 --- a/pkg/packagers/uv/build.go +++ b/pkg/packagers/uv/build.go @@ -15,11 +15,10 @@ import ( "github.com/paketo-buildpacks/packit/v2/fs" "github.com/paketo-buildpacks/packit/v2/sbom" - pythonpackagers "github.com/paketo-buildpacks/python-packagers/pkg/packagers/common" + "github.com/paketo-buildpacks/python-packagers/pkg/build" ) //go:generate faux --interface Runner --output fakes/runner.go -//go:generate faux --interface SBOMGenerator --output fakes/sbom_generator.go // Runner defines the interface for setting up the uv environment. type Runner interface { @@ -41,7 +40,7 @@ type UvBuildParameters struct { // determined by the runner. func Build( buildParameters UvBuildParameters, - parameters pythonpackagers.CommonBuildParameters, + parameters build.CommonBuildParameters, ) packit.BuildFunc { return func(context packit.BuildContext) (packit.BuildResult, error) { runner := buildParameters.Runner diff --git a/pkg/packagers/uv/build_test.go b/pkg/packagers/uv/build_test.go index 54a0b2fc..4523b26f 100644 --- a/pkg/packagers/uv/build_test.go +++ b/pkg/packagers/uv/build_test.go @@ -18,9 +18,10 @@ import ( "github.com/paketo-buildpacks/packit/v2/scribe" "github.com/sclevine/spec" - pythonpackagers "github.com/paketo-buildpacks/python-packagers/pkg/packagers/common" + "github.com/paketo-buildpacks/python-packagers/pkg/build" uvinstall "github.com/paketo-buildpacks/python-packagers/pkg/packagers/uv" "github.com/paketo-buildpacks/python-packagers/pkg/packagers/uv/fakes" + sbomfakes "github.com/paketo-buildpacks/python-packagers/pkg/sbom/fakes" . "github.com/onsi/gomega" ) @@ -36,9 +37,9 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { buffer *bytes.Buffer runner *fakes.Runner - sbomGenerator *fakes.SBOMGenerator + sbomGenerator *sbomfakes.SBOMGenerator - build packit.BuildFunc + buildFunc packit.BuildFunc buildContext packit.BuildContext ) @@ -54,7 +55,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { Expect(err).NotTo(HaveOccurred()) runner = &fakes.Runner{} - sbomGenerator = &fakes.SBOMGenerator{} + sbomGenerator = &sbomfakes.SBOMGenerator{} runner.ShouldRunCall.Returns.Bool = true runner.ShouldRunCall.Returns.String = "some-sha" @@ -64,11 +65,11 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { buffer = bytes.NewBuffer(nil) logger := scribe.NewEmitter(buffer) - build = uvinstall.Build( + buildFunc = uvinstall.Build( uvinstall.UvBuildParameters{ runner, }, - pythonpackagers.CommonBuildParameters{ + build.CommonBuildParameters{ SbomGenerator: sbomGenerator, Clock: chronos.DefaultClock, Logger: logger, @@ -102,7 +103,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("returns a result that builds correctly", func() { - result, err := build(buildContext) + result, err := buildFunc(buildContext) Expect(err).NotTo(HaveOccurred()) layers := result.Layers @@ -152,7 +153,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("cache layer is exported", func() { - result, err := build(buildContext) + result, err := buildFunc(buildContext) Expect(err).NotTo(HaveOccurred()) layers := result.Layers @@ -179,7 +180,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("assigns the flag to the uv env layer", func() { - result, err := build(buildContext) + result, err := buildFunc(buildContext) Expect(err).NotTo(HaveOccurred()) layers := result.Layers @@ -202,7 +203,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("assigns build and cache to the uv env layer", func() { - result, err := build(buildContext) + result, err := buildFunc(buildContext) Expect(err).NotTo(HaveOccurred()) layers := result.Layers @@ -224,7 +225,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("reuses cached uv env layer instead of running build process", func() { - result, err := build(buildContext) + result, err := buildFunc(buildContext) Expect(err).NotTo(HaveOccurred()) layers := result.Layers @@ -244,7 +245,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("returns an error", func() { - _, err := build(buildContext) + _, err := buildFunc(buildContext) Expect(err).To(MatchError(ContainSubstring("permission denied"))) }) }) @@ -255,7 +256,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("returns an error", func() { - _, err := build(buildContext) + _, err := buildFunc(buildContext) Expect(err).To(MatchError(ContainSubstring("permission denied"))) }) }) @@ -266,7 +267,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("returns an error", func() { - _, err := build(buildContext) + _, err := buildFunc(buildContext) Expect(err).To(MatchError("some-shouldrun-error")) }) }) @@ -281,7 +282,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("returns an error", func() { - _, err := build(buildContext) + _, err := buildFunc(buildContext) Expect(err).To(MatchError(ContainSubstring("error could not create directory"))) }) }) @@ -293,7 +294,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("returns an error", func() { - _, err := build(buildContext) + _, err := buildFunc(buildContext) Expect(err).To(MatchError(ContainSubstring("some execution error"))) }) }) @@ -304,7 +305,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("returns an error", func() { - _, err := build(buildContext) + _, err := buildFunc(buildContext) Expect(err).To(MatchError(`unsupported SBOM format: 'random-format'`)) }) }) @@ -315,7 +316,7 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }) it("returns an error", func() { - _, err := build(buildContext) + _, err := buildFunc(buildContext) Expect(err).To(MatchError(ContainSubstring("failed to generate SBOM"))) }) }) diff --git a/pkg/packagers/uv/detect.go b/pkg/packagers/uv/detect.go index c7e17d43..b3ec151b 100644 --- a/pkg/packagers/uv/detect.go +++ b/pkg/packagers/uv/detect.go @@ -11,7 +11,7 @@ import ( "github.com/paketo-buildpacks/packit/v2" "github.com/paketo-buildpacks/packit/v2/fs" - common "github.com/paketo-buildpacks/python-packagers/pkg/packagers/common" + "github.com/paketo-buildpacks/python-packagers/pkg/build" ) // Detect returns a packit.DetectFunc that will be invoked during the @@ -40,7 +40,7 @@ func Detect() packit.DetectFunc { requires := []packit.BuildPlanRequirement{ { Name: UvPlanEntry, - Metadata: common.BuildPlanMetadata{ + Metadata: build.BuildPlanMetadata{ Build: true, }, }, @@ -53,7 +53,7 @@ func Detect() packit.DetectFunc { requires = append(requires, packit.BuildPlanRequirement{ Name: "cpython", - Metadata: common.BuildPlanMetadata{ + Metadata: build.BuildPlanMetadata{ Build: true, Launch: true, Version: version, diff --git a/pkg/packagers/uv/detect_test.go b/pkg/packagers/uv/detect_test.go index 90f5f52f..b72af310 100644 --- a/pkg/packagers/uv/detect_test.go +++ b/pkg/packagers/uv/detect_test.go @@ -15,7 +15,7 @@ import ( . "github.com/onsi/gomega" - common "github.com/paketo-buildpacks/python-packagers/pkg/packagers/common" + "github.com/paketo-buildpacks/python-packagers/pkg/build" uvinstall "github.com/paketo-buildpacks/python-packagers/pkg/packagers/uv" ) @@ -59,7 +59,7 @@ func testDetect(t *testing.T, context spec.G, it spec.S) { Requires: []packit.BuildPlanRequirement{ { Name: uvinstall.UvPlanEntry, - Metadata: common.BuildPlanMetadata{ + Metadata: build.BuildPlanMetadata{ Build: true, }, }, diff --git a/pkg/packagers/uv/fakes/sbom_generator.go b/pkg/packagers/uv/fakes/sbom_generator.go deleted file mode 100644 index 9897b0d6..00000000 --- a/pkg/packagers/uv/fakes/sbom_generator.go +++ /dev/null @@ -1,37 +0,0 @@ -// SPDX-FileCopyrightText: Copyright (c) 2013-Present CloudFoundry.org Foundation, Inc. All Rights Reserved. -// -// SPDX-License-Identifier: Apache-2.0 - -package fakes - -import ( - "sync" - - "github.com/paketo-buildpacks/packit/v2/sbom" -) - -type SBOMGenerator struct { - GenerateCall struct { - mutex sync.Mutex - CallCount int - Receives struct { - Dir string - } - Returns struct { - SBOM sbom.SBOM - Error error - } - Stub func(string) (sbom.SBOM, error) - } -} - -func (f *SBOMGenerator) Generate(param1 string) (sbom.SBOM, error) { - f.GenerateCall.mutex.Lock() - defer f.GenerateCall.mutex.Unlock() - f.GenerateCall.CallCount++ - f.GenerateCall.Receives.Dir = param1 - if f.GenerateCall.Stub != nil { - return f.GenerateCall.Stub(param1) - } - return f.GenerateCall.Returns.SBOM, f.GenerateCall.Returns.Error -} diff --git a/pkg/packagers/conda/fakes/sbom_generator.go b/pkg/sbom/fakes/sbom_generator.go similarity index 100% rename from pkg/packagers/conda/fakes/sbom_generator.go rename to pkg/sbom/fakes/sbom_generator.go diff --git a/pkg/sbom/sbom.go b/pkg/sbom/sbom.go new file mode 100644 index 00000000..11bf1bfa --- /dev/null +++ b/pkg/sbom/sbom.go @@ -0,0 +1,22 @@ +// SPDX-FileCopyrightText: © 2025 Idiap Research Institute +// SPDX-FileContributor: Samuel Gaist +// +// SPDX-License-Identifier: Apache-2.0 + +package sbom + +import ( + "github.com/paketo-buildpacks/packit/v2/sbom" +) + +//go:generate faux --interface SBOMGenerator --output fakes/sbom_generator.go + +type SBOMGenerator interface { + Generate(dir string) (sbom.SBOM, error) +} + +type Generator struct{} + +func (f Generator) Generate(dir string) (sbom.SBOM, error) { + return sbom.Generate(dir) +} diff --git a/run/main.go b/run/main.go index edae6cb6..d17340a2 100644 --- a/run/main.go +++ b/run/main.go @@ -15,20 +15,21 @@ import ( "github.com/paketo-buildpacks/packit/v2/pexec" "github.com/paketo-buildpacks/packit/v2/scribe" pythonpackagers "github.com/paketo-buildpacks/python-packagers" - pkgcommon "github.com/paketo-buildpacks/python-packagers/pkg/packagers/common" + "github.com/paketo-buildpacks/python-packagers/pkg/build" conda "github.com/paketo-buildpacks/python-packagers/pkg/packagers/conda" pipinstall "github.com/paketo-buildpacks/python-packagers/pkg/packagers/pip" pipenvinstall "github.com/paketo-buildpacks/python-packagers/pkg/packagers/pipenv" pixiinstall "github.com/paketo-buildpacks/python-packagers/pkg/packagers/pixi" poetryinstall "github.com/paketo-buildpacks/python-packagers/pkg/packagers/poetry" uvinstall "github.com/paketo-buildpacks/python-packagers/pkg/packagers/uv" + "github.com/paketo-buildpacks/python-packagers/pkg/sbom" ) func main() { logger := scribe.NewEmitter(os.Stdout).WithLevel(os.Getenv("BP_LOG_LEVEL")) - buildParameters := pkgcommon.CommonBuildParameters{ - SbomGenerator: pkgcommon.Generator{}, + buildParameters := build.CommonBuildParameters{ + SbomGenerator: sbom.Generator{}, Clock: chronos.DefaultClock, Logger: logger, } From cef13bde70865d500b589d9280e02ff420a6182e Mon Sep 17 00:00:00 2001 From: Samuel Gaist Date: Sat, 21 Feb 2026 15:38:59 +0100 Subject: [PATCH 2/4] chore: goimports cleanup --- detect_test.go | 1 + run/main.go | 1 + 2 files changed, 2 insertions(+) diff --git a/detect_test.go b/detect_test.go index 6b34b133..d33e7886 100644 --- a/detect_test.go +++ b/detect_test.go @@ -13,6 +13,7 @@ import ( "github.com/paketo-buildpacks/packit/v2" "github.com/paketo-buildpacks/packit/v2/scribe" + pythonpackagers "github.com/paketo-buildpacks/python-packagers" "github.com/paketo-buildpacks/python-packagers/pkg/build" conda "github.com/paketo-buildpacks/python-packagers/pkg/packagers/conda" diff --git a/run/main.go b/run/main.go index d17340a2..219d5993 100644 --- a/run/main.go +++ b/run/main.go @@ -14,6 +14,7 @@ import ( "github.com/paketo-buildpacks/packit/v2/fs" "github.com/paketo-buildpacks/packit/v2/pexec" "github.com/paketo-buildpacks/packit/v2/scribe" + pythonpackagers "github.com/paketo-buildpacks/python-packagers" "github.com/paketo-buildpacks/python-packagers/pkg/build" conda "github.com/paketo-buildpacks/python-packagers/pkg/packagers/conda" From afc3bce9ec40bc533e894aec5f465e19bfe9751b Mon Sep 17 00:00:00 2001 From: Samuel Gaist Date: Sat, 21 Feb 2026 16:04:08 +0100 Subject: [PATCH 3/4] refactor: move Executable in own module --- pkg/executable/executable.go | 16 ++++++++ .../conda => executable}/fakes/executable.go | 0 pkg/packagers/conda/conda_runner.go | 13 ++----- pkg/packagers/conda/conda_runner_test.go | 5 ++- pkg/packagers/pip/fakes/executable.go | 36 ------------------ pkg/packagers/pip/install_process.go | 13 ++----- pkg/packagers/pip/install_process_test.go | 2 +- pkg/packagers/pip/site_process.go | 6 ++- pkg/packagers/pip/site_process_test.go | 2 +- pkg/packagers/pipenv/fakes/executable.go | 36 ------------------ pkg/packagers/pipenv/install_process.go | 13 ++----- pkg/packagers/pipenv/install_process_test.go | 2 +- pkg/packagers/pipenv/site_process.go | 6 ++- pkg/packagers/pipenv/site_process_test.go | 2 +- pkg/packagers/pixi/fakes/executable.go | 37 ------------------- pkg/packagers/pixi/pixi_runner.go | 13 ++----- pkg/packagers/pixi/pixi_runner_test.go | 5 ++- pkg/packagers/poetry/fakes/executable.go | 36 ------------------ pkg/packagers/poetry/install_process.go | 13 ++----- pkg/packagers/poetry/install_process_test.go | 2 +- pkg/packagers/uv/fakes/executable.go | 36 ------------------ pkg/packagers/uv/uv_runner.go | 13 ++----- pkg/packagers/uv/uv_runner_test.go | 5 ++- 23 files changed, 62 insertions(+), 250 deletions(-) create mode 100644 pkg/executable/executable.go rename pkg/{packagers/conda => executable}/fakes/executable.go (100%) delete mode 100644 pkg/packagers/pip/fakes/executable.go delete mode 100644 pkg/packagers/pipenv/fakes/executable.go delete mode 100644 pkg/packagers/pixi/fakes/executable.go delete mode 100644 pkg/packagers/poetry/fakes/executable.go delete mode 100644 pkg/packagers/uv/fakes/executable.go diff --git a/pkg/executable/executable.go b/pkg/executable/executable.go new file mode 100644 index 00000000..86a1c46a --- /dev/null +++ b/pkg/executable/executable.go @@ -0,0 +1,16 @@ +// SPDX-FileCopyrightText: Copyright (c) 2013-Present CloudFoundry.org Foundation, Inc. All Rights Reserved. +// +// SPDX-License-Identifier: Apache-2.0 + +package executable + +import ( + "github.com/paketo-buildpacks/packit/v2/pexec" +) + +//go:generate faux --interface Executable --output fakes/executable.go + +// Executable defines the interface for invoking an executable. +type Executable interface { + Execute(pexec.Execution) error +} diff --git a/pkg/packagers/conda/fakes/executable.go b/pkg/executable/fakes/executable.go similarity index 100% rename from pkg/packagers/conda/fakes/executable.go rename to pkg/executable/fakes/executable.go diff --git a/pkg/packagers/conda/conda_runner.go b/pkg/packagers/conda/conda_runner.go index 19a432b4..6ffeed64 100644 --- a/pkg/packagers/conda/conda_runner.go +++ b/pkg/packagers/conda/conda_runner.go @@ -14,14 +14,9 @@ import ( "github.com/paketo-buildpacks/packit/v2/fs" "github.com/paketo-buildpacks/packit/v2/pexec" "github.com/paketo-buildpacks/packit/v2/scribe" -) - -//go:generate faux --interface Executable --output fakes/executable.go -// Executable defines the interface for invoking an executable. -type Executable interface { - Execute(pexec.Execution) error -} + "github.com/paketo-buildpacks/python-packagers/pkg/executable" +) // Summer defines the interface for computing a SHA256 for a set of files // and/or directories. @@ -34,12 +29,12 @@ type Summer interface { // CondaRunner implements the Runner interface. type CondaRunner struct { logger scribe.Emitter - executable Executable + executable executable.Executable summer Summer } // NewCondaRunner creates an instance of CondaRunner given an Executable, a Summer, and a Logger. -func NewCondaRunner(executable Executable, summer Summer, logger scribe.Emitter) CondaRunner { +func NewCondaRunner(executable executable.Executable, summer Summer, logger scribe.Emitter) CondaRunner { return CondaRunner{ executable: executable, summer: summer, diff --git a/pkg/packagers/conda/conda_runner_test.go b/pkg/packagers/conda/conda_runner_test.go index 2d15da0c..66ad9213 100644 --- a/pkg/packagers/conda/conda_runner_test.go +++ b/pkg/packagers/conda/conda_runner_test.go @@ -17,6 +17,7 @@ import ( "github.com/paketo-buildpacks/packit/v2/scribe" "github.com/sclevine/spec" + executablefakes "github.com/paketo-buildpacks/python-packagers/pkg/executable/fakes" condaenvupdate "github.com/paketo-buildpacks/python-packagers/pkg/packagers/conda" "github.com/paketo-buildpacks/python-packagers/pkg/packagers/conda/fakes" @@ -32,7 +33,7 @@ func testCondaRunner(t *testing.T, context spec.G, it spec.S) { condaLayerPath string condaCachePath string - executable *fakes.Executable + executable *executablefakes.Executable executions []pexec.Execution summer *fakes.Summer runner condaenvupdate.CondaRunner @@ -47,7 +48,7 @@ func testCondaRunner(t *testing.T, context spec.G, it spec.S) { condaLayerPath = filepath.Join(layersDir, "a-conda-layer") condaCachePath = filepath.Join(layersDir, "a-conda-cache-path") - executable = &fakes.Executable{} + executable = &executablefakes.Executable{} executions = []pexec.Execution{} executable.ExecuteCall.Stub = func(ex pexec.Execution) error { executions = append(executions, ex) diff --git a/pkg/packagers/pip/fakes/executable.go b/pkg/packagers/pip/fakes/executable.go deleted file mode 100644 index 49bf278f..00000000 --- a/pkg/packagers/pip/fakes/executable.go +++ /dev/null @@ -1,36 +0,0 @@ -// SPDX-FileCopyrightText: Copyright (c) 2013-Present CloudFoundry.org Foundation, Inc. All Rights Reserved. -// -// SPDX-License-Identifier: Apache-2.0 - -package fakes - -import ( - "sync" - - "github.com/paketo-buildpacks/packit/v2/pexec" -) - -type Executable struct { - ExecuteCall struct { - mutex sync.Mutex - CallCount int - Receives struct { - Execution pexec.Execution - } - Returns struct { - Error error - } - Stub func(pexec.Execution) error - } -} - -func (f *Executable) Execute(param1 pexec.Execution) error { - f.ExecuteCall.mutex.Lock() - defer f.ExecuteCall.mutex.Unlock() - f.ExecuteCall.CallCount++ - f.ExecuteCall.Receives.Execution = param1 - if f.ExecuteCall.Stub != nil { - return f.ExecuteCall.Stub(param1) - } - return f.ExecuteCall.Returns.Error -} diff --git a/pkg/packagers/pip/install_process.go b/pkg/packagers/pip/install_process.go index b660f0f3..83ee4b91 100644 --- a/pkg/packagers/pip/install_process.go +++ b/pkg/packagers/pip/install_process.go @@ -13,23 +13,18 @@ import ( "github.com/paketo-buildpacks/packit/v2/fs" "github.com/paketo-buildpacks/packit/v2/pexec" "github.com/paketo-buildpacks/packit/v2/scribe" -) - -//go:generate faux --interface Executable --output fakes/executable.go -// Executable defines the interface for invoking an executable. -type Executable interface { - Execute(pexec.Execution) error -} + "github.com/paketo-buildpacks/python-packagers/pkg/executable" +) // PipInstallProcess implements the InstallProcess interface. type PipInstallProcess struct { - executable Executable + executable executable.Executable logger scribe.Emitter } // NewPipInstallProcess creates an instance of the PipInstallProcess given an Executable. -func NewPipInstallProcess(executable Executable, logger scribe.Emitter) PipInstallProcess { +func NewPipInstallProcess(executable executable.Executable, logger scribe.Emitter) PipInstallProcess { return PipInstallProcess{ executable: executable, logger: logger, diff --git a/pkg/packagers/pip/install_process_test.go b/pkg/packagers/pip/install_process_test.go index 50f0e3d6..6344f97b 100644 --- a/pkg/packagers/pip/install_process_test.go +++ b/pkg/packagers/pip/install_process_test.go @@ -16,8 +16,8 @@ import ( "github.com/paketo-buildpacks/packit/v2/scribe" "github.com/sclevine/spec" + "github.com/paketo-buildpacks/python-packagers/pkg/executable/fakes" pipinstall "github.com/paketo-buildpacks/python-packagers/pkg/packagers/pip" - "github.com/paketo-buildpacks/python-packagers/pkg/packagers/pip/fakes" . "github.com/onsi/gomega" . "github.com/onsi/gomega/gstruct" diff --git a/pkg/packagers/pip/site_process.go b/pkg/packagers/pip/site_process.go index 2c31ee1d..3e94d40d 100644 --- a/pkg/packagers/pip/site_process.go +++ b/pkg/packagers/pip/site_process.go @@ -11,15 +11,17 @@ import ( "strings" "github.com/paketo-buildpacks/packit/v2/pexec" + + "github.com/paketo-buildpacks/python-packagers/pkg/executable" ) // SiteProcess implements the Executable interface. type SiteProcess struct { - executable Executable + executable executable.Executable } // NewSiteProcess creates an instance of the SiteProcess given an Executable that runs `python` -func NewSiteProcess(executable Executable) SiteProcess { +func NewSiteProcess(executable executable.Executable) SiteProcess { return SiteProcess{ executable: executable, } diff --git a/pkg/packagers/pip/site_process_test.go b/pkg/packagers/pip/site_process_test.go index 5a41ee47..d09f0ef9 100644 --- a/pkg/packagers/pip/site_process_test.go +++ b/pkg/packagers/pip/site_process_test.go @@ -14,8 +14,8 @@ import ( "github.com/paketo-buildpacks/packit/v2/pexec" "github.com/sclevine/spec" + "github.com/paketo-buildpacks/python-packagers/pkg/executable/fakes" pipinstall "github.com/paketo-buildpacks/python-packagers/pkg/packagers/pip" - "github.com/paketo-buildpacks/python-packagers/pkg/packagers/pip/fakes" . "github.com/onsi/gomega" ) diff --git a/pkg/packagers/pipenv/fakes/executable.go b/pkg/packagers/pipenv/fakes/executable.go deleted file mode 100644 index 49bf278f..00000000 --- a/pkg/packagers/pipenv/fakes/executable.go +++ /dev/null @@ -1,36 +0,0 @@ -// SPDX-FileCopyrightText: Copyright (c) 2013-Present CloudFoundry.org Foundation, Inc. All Rights Reserved. -// -// SPDX-License-Identifier: Apache-2.0 - -package fakes - -import ( - "sync" - - "github.com/paketo-buildpacks/packit/v2/pexec" -) - -type Executable struct { - ExecuteCall struct { - mutex sync.Mutex - CallCount int - Receives struct { - Execution pexec.Execution - } - Returns struct { - Error error - } - Stub func(pexec.Execution) error - } -} - -func (f *Executable) Execute(param1 pexec.Execution) error { - f.ExecuteCall.mutex.Lock() - defer f.ExecuteCall.mutex.Unlock() - f.ExecuteCall.CallCount++ - f.ExecuteCall.Receives.Execution = param1 - if f.ExecuteCall.Stub != nil { - return f.ExecuteCall.Stub(param1) - } - return f.ExecuteCall.Returns.Error -} diff --git a/pkg/packagers/pipenv/install_process.go b/pkg/packagers/pipenv/install_process.go index a5616270..1746d7f5 100644 --- a/pkg/packagers/pipenv/install_process.go +++ b/pkg/packagers/pipenv/install_process.go @@ -15,23 +15,18 @@ import ( "github.com/paketo-buildpacks/packit/v2" "github.com/paketo-buildpacks/packit/v2/pexec" "github.com/paketo-buildpacks/packit/v2/scribe" -) - -//go:generate faux --interface Executable --output fakes/executable.go -// Executable defines the interface for invoking an executable. -type Executable interface { - Execute(pexec.Execution) error -} + "github.com/paketo-buildpacks/python-packagers/pkg/executable" +) // PipenvInstallProcess implements the InstallProcess interface. type PipenvInstallProcess struct { - executable Executable + executable executable.Executable logger scribe.Emitter } // NewPipenvInstallProcess creates an instance of the PipenvInstallProcess given an Executable. -func NewPipenvInstallProcess(executable Executable, logger scribe.Emitter) PipenvInstallProcess { +func NewPipenvInstallProcess(executable executable.Executable, logger scribe.Emitter) PipenvInstallProcess { return PipenvInstallProcess{ executable: executable, logger: logger, diff --git a/pkg/packagers/pipenv/install_process_test.go b/pkg/packagers/pipenv/install_process_test.go index 00344997..2281a6bb 100644 --- a/pkg/packagers/pipenv/install_process_test.go +++ b/pkg/packagers/pipenv/install_process_test.go @@ -16,8 +16,8 @@ import ( "github.com/paketo-buildpacks/packit/v2/scribe" "github.com/sclevine/spec" + "github.com/paketo-buildpacks/python-packagers/pkg/executable/fakes" pipenvinstall "github.com/paketo-buildpacks/python-packagers/pkg/packagers/pipenv" - "github.com/paketo-buildpacks/python-packagers/pkg/packagers/pipenv/fakes" . "github.com/onsi/gomega" ) diff --git a/pkg/packagers/pipenv/site_process.go b/pkg/packagers/pipenv/site_process.go index 06ccd21e..7325f880 100644 --- a/pkg/packagers/pipenv/site_process.go +++ b/pkg/packagers/pipenv/site_process.go @@ -11,15 +11,17 @@ import ( "strings" "github.com/paketo-buildpacks/packit/v2/pexec" + + "github.com/paketo-buildpacks/python-packagers/pkg/executable" ) // SiteProcess implements the Executable interface. type SiteProcess struct { - executable Executable + executable executable.Executable } // NewSiteProcess creates an instance of the SiteProcess given an Executable that runs `python` -func NewSiteProcess(executable Executable) SiteProcess { +func NewSiteProcess(executable executable.Executable) SiteProcess { return SiteProcess{ executable: executable, } diff --git a/pkg/packagers/pipenv/site_process_test.go b/pkg/packagers/pipenv/site_process_test.go index 8b62579f..1ceeae1c 100644 --- a/pkg/packagers/pipenv/site_process_test.go +++ b/pkg/packagers/pipenv/site_process_test.go @@ -14,8 +14,8 @@ import ( "github.com/paketo-buildpacks/packit/v2/pexec" "github.com/sclevine/spec" + "github.com/paketo-buildpacks/python-packagers/pkg/executable/fakes" pipenvinstall "github.com/paketo-buildpacks/python-packagers/pkg/packagers/pipenv" - "github.com/paketo-buildpacks/python-packagers/pkg/packagers/pipenv/fakes" . "github.com/onsi/gomega" ) diff --git a/pkg/packagers/pixi/fakes/executable.go b/pkg/packagers/pixi/fakes/executable.go deleted file mode 100644 index ea57e1a4..00000000 --- a/pkg/packagers/pixi/fakes/executable.go +++ /dev/null @@ -1,37 +0,0 @@ -// SPDX-FileCopyrightText: © 2026 Idiap Research Institute -// SPDX-FileContributor: Samuel Gaist -// -// SPDX-License-Identifier: Apache-2.0 - -package fakes - -import ( - "sync" - - "github.com/paketo-buildpacks/packit/v2/pexec" -) - -type Executable struct { - ExecuteCall struct { - mutex sync.Mutex - CallCount int - Receives struct { - Execution pexec.Execution - } - Returns struct { - Error error - } - Stub func(pexec.Execution) error - } -} - -func (f *Executable) Execute(param1 pexec.Execution) error { - f.ExecuteCall.mutex.Lock() - defer f.ExecuteCall.mutex.Unlock() - f.ExecuteCall.CallCount++ - f.ExecuteCall.Receives.Execution = param1 - if f.ExecuteCall.Stub != nil { - return f.ExecuteCall.Stub(param1) - } - return f.ExecuteCall.Returns.Error -} diff --git a/pkg/packagers/pixi/pixi_runner.go b/pkg/packagers/pixi/pixi_runner.go index fc42ea91..46691c42 100644 --- a/pkg/packagers/pixi/pixi_runner.go +++ b/pkg/packagers/pixi/pixi_runner.go @@ -15,14 +15,9 @@ import ( "github.com/paketo-buildpacks/packit/v2/fs" "github.com/paketo-buildpacks/packit/v2/pexec" "github.com/paketo-buildpacks/packit/v2/scribe" -) - -//go:generate faux --interface Executable --output fakes/executable.go -// Executable defines the interface for invoking an executable. -type Executable interface { - Execute(pexec.Execution) error -} + "github.com/paketo-buildpacks/python-packagers/pkg/executable" +) // Summer defines the interface for computing a SHA256 for a set of files // and/or directories. @@ -35,7 +30,7 @@ type Summer interface { // PixiRunner implements the Runner interface. type PixiRunner struct { logger scribe.Emitter - executable Executable + executable executable.Executable summer Summer } @@ -46,7 +41,7 @@ type Package struct { } // NewPixiRunner creates an instance of PixiRunner given an Executable, a Summer, and a Logger. -func NewPixiRunner(executable Executable, summer Summer, logger scribe.Emitter) PixiRunner { +func NewPixiRunner(executable executable.Executable, summer Summer, logger scribe.Emitter) PixiRunner { return PixiRunner{ executable: executable, summer: summer, diff --git a/pkg/packagers/pixi/pixi_runner_test.go b/pkg/packagers/pixi/pixi_runner_test.go index 9b09ad6e..5e08a846 100644 --- a/pkg/packagers/pixi/pixi_runner_test.go +++ b/pkg/packagers/pixi/pixi_runner_test.go @@ -20,6 +20,7 @@ import ( . "github.com/onsi/gomega" . "github.com/paketo-buildpacks/occam/matchers" + executablefakes "github.com/paketo-buildpacks/python-packagers/pkg/executable/fakes" pixiinstall "github.com/paketo-buildpacks/python-packagers/pkg/packagers/pixi" "github.com/paketo-buildpacks/python-packagers/pkg/packagers/pixi/fakes" ) @@ -32,7 +33,7 @@ func testPixiRunner(t *testing.T, context spec.G, it spec.S) { pixiLayerPath string pixiCachePath string - executable *fakes.Executable + executable *executablefakes.Executable executions []pexec.Execution summer *fakes.Summer runner pixiinstall.PixiRunner @@ -47,7 +48,7 @@ func testPixiRunner(t *testing.T, context spec.G, it spec.S) { pixiLayerPath = filepath.Join(layersDir, "a-pixi-layer") pixiCachePath = filepath.Join(layersDir, "a-pixi-cache-path") - executable = &fakes.Executable{} + executable = &executablefakes.Executable{} executions = []pexec.Execution{} executable.ExecuteCall.Stub = func(ex pexec.Execution) error { executions = append(executions, ex) diff --git a/pkg/packagers/poetry/fakes/executable.go b/pkg/packagers/poetry/fakes/executable.go deleted file mode 100644 index 49bf278f..00000000 --- a/pkg/packagers/poetry/fakes/executable.go +++ /dev/null @@ -1,36 +0,0 @@ -// SPDX-FileCopyrightText: Copyright (c) 2013-Present CloudFoundry.org Foundation, Inc. All Rights Reserved. -// -// SPDX-License-Identifier: Apache-2.0 - -package fakes - -import ( - "sync" - - "github.com/paketo-buildpacks/packit/v2/pexec" -) - -type Executable struct { - ExecuteCall struct { - mutex sync.Mutex - CallCount int - Receives struct { - Execution pexec.Execution - } - Returns struct { - Error error - } - Stub func(pexec.Execution) error - } -} - -func (f *Executable) Execute(param1 pexec.Execution) error { - f.ExecuteCall.mutex.Lock() - defer f.ExecuteCall.mutex.Unlock() - f.ExecuteCall.CallCount++ - f.ExecuteCall.Receives.Execution = param1 - if f.ExecuteCall.Stub != nil { - return f.ExecuteCall.Stub(param1) - } - return f.ExecuteCall.Returns.Error -} diff --git a/pkg/packagers/poetry/install_process.go b/pkg/packagers/poetry/install_process.go index 4e871798..251a3005 100644 --- a/pkg/packagers/poetry/install_process.go +++ b/pkg/packagers/poetry/install_process.go @@ -13,23 +13,18 @@ import ( "github.com/paketo-buildpacks/packit/v2/pexec" "github.com/paketo-buildpacks/packit/v2/scribe" -) - -//go:generate faux --interface Executable --output fakes/executable.go -// Executable defines the interface for invoking an executable. -type Executable interface { - Execute(pexec.Execution) error -} + "github.com/paketo-buildpacks/python-packagers/pkg/executable" +) // PoetryInstallProcess implements the InstallProcess interface. type PoetryInstallProcess struct { - executable Executable + executable executable.Executable logger scribe.Emitter } // NewPoetryInstallProcess creates an instance of the PoetryInstallProcess given an Executable. -func NewPoetryInstallProcess(executable Executable, logger scribe.Emitter) PoetryInstallProcess { +func NewPoetryInstallProcess(executable executable.Executable, logger scribe.Emitter) PoetryInstallProcess { return PoetryInstallProcess{ executable: executable, logger: logger, diff --git a/pkg/packagers/poetry/install_process_test.go b/pkg/packagers/poetry/install_process_test.go index 245a8b93..b2cc578f 100644 --- a/pkg/packagers/poetry/install_process_test.go +++ b/pkg/packagers/poetry/install_process_test.go @@ -15,8 +15,8 @@ import ( "github.com/paketo-buildpacks/packit/v2/scribe" "github.com/sclevine/spec" + "github.com/paketo-buildpacks/python-packagers/pkg/executable/fakes" poetryinstall "github.com/paketo-buildpacks/python-packagers/pkg/packagers/poetry" - "github.com/paketo-buildpacks/python-packagers/pkg/packagers/poetry/fakes" . "github.com/onsi/gomega" . "github.com/onsi/gomega/gstruct" diff --git a/pkg/packagers/uv/fakes/executable.go b/pkg/packagers/uv/fakes/executable.go deleted file mode 100644 index 49bf278f..00000000 --- a/pkg/packagers/uv/fakes/executable.go +++ /dev/null @@ -1,36 +0,0 @@ -// SPDX-FileCopyrightText: Copyright (c) 2013-Present CloudFoundry.org Foundation, Inc. All Rights Reserved. -// -// SPDX-License-Identifier: Apache-2.0 - -package fakes - -import ( - "sync" - - "github.com/paketo-buildpacks/packit/v2/pexec" -) - -type Executable struct { - ExecuteCall struct { - mutex sync.Mutex - CallCount int - Receives struct { - Execution pexec.Execution - } - Returns struct { - Error error - } - Stub func(pexec.Execution) error - } -} - -func (f *Executable) Execute(param1 pexec.Execution) error { - f.ExecuteCall.mutex.Lock() - defer f.ExecuteCall.mutex.Unlock() - f.ExecuteCall.CallCount++ - f.ExecuteCall.Receives.Execution = param1 - if f.ExecuteCall.Stub != nil { - return f.ExecuteCall.Stub(param1) - } - return f.ExecuteCall.Returns.Error -} diff --git a/pkg/packagers/uv/uv_runner.go b/pkg/packagers/uv/uv_runner.go index 8dcda529..701a6650 100644 --- a/pkg/packagers/uv/uv_runner.go +++ b/pkg/packagers/uv/uv_runner.go @@ -15,14 +15,9 @@ import ( "github.com/paketo-buildpacks/packit/v2/fs" "github.com/paketo-buildpacks/packit/v2/pexec" "github.com/paketo-buildpacks/packit/v2/scribe" -) - -//go:generate faux --interface Executable --output fakes/executable.go -// Executable defines the interface for invoking an executable. -type Executable interface { - Execute(pexec.Execution) error -} + "github.com/paketo-buildpacks/python-packagers/pkg/executable" +) // Summer defines the interface for computing a SHA256 for a set of files // and/or directories. @@ -34,13 +29,13 @@ type Summer interface { // UvRunner implements the Runner interface. type UvRunner struct { - executable Executable + executable executable.Executable summer Summer logger scribe.Emitter } // NewUvRunner creates an instance of UvRunner given an Executable and a Logger. -func NewUvRunner(executable Executable, summer Summer, logger scribe.Emitter) UvRunner { +func NewUvRunner(executable executable.Executable, summer Summer, logger scribe.Emitter) UvRunner { return UvRunner{ executable: executable, summer: summer, diff --git a/pkg/packagers/uv/uv_runner_test.go b/pkg/packagers/uv/uv_runner_test.go index 406b8304..1327c6a6 100644 --- a/pkg/packagers/uv/uv_runner_test.go +++ b/pkg/packagers/uv/uv_runner_test.go @@ -18,6 +18,7 @@ import ( "github.com/paketo-buildpacks/packit/v2/scribe" "github.com/sclevine/spec" + executablefakes "github.com/paketo-buildpacks/python-packagers/pkg/executable/fakes" uv "github.com/paketo-buildpacks/python-packagers/pkg/packagers/uv" "github.com/paketo-buildpacks/python-packagers/pkg/packagers/uv/fakes" @@ -33,7 +34,7 @@ func testUvRunner(t *testing.T, context spec.G, it spec.S) { uvLayerPath string uvCachePath string - executable *fakes.Executable + executable *executablefakes.Executable executions []pexec.Execution summer *fakes.Summer runner uv.UvRunner @@ -48,7 +49,7 @@ func testUvRunner(t *testing.T, context spec.G, it spec.S) { uvLayerPath = filepath.Join(layersDir, "a-uv-layer") uvCachePath = filepath.Join(layersDir, "a-uv-cache-path") - executable = &fakes.Executable{} + executable = &executablefakes.Executable{} executions = []pexec.Execution{} executable.ExecuteCall.Stub = func(ex pexec.Execution) error { executions = append(executions, ex) From f12ae22de456a931ff99e188d8fd146191d961bd Mon Sep 17 00:00:00 2001 From: Samuel Gaist Date: Sat, 21 Feb 2026 16:19:23 +0100 Subject: [PATCH 4/4] refactor: move Summer in own package --- pkg/packagers/conda/conda_runner.go | 13 ++----- pkg/packagers/conda/conda_runner_test.go | 6 ++-- pkg/packagers/pixi/fakes/summer.go | 34 ------------------- pkg/packagers/pixi/pixi_runner_test.go | 6 ++-- pkg/packagers/uv/fakes/summer.go | 33 ------------------ pkg/packagers/uv/uv_runner.go | 13 ++----- pkg/packagers/uv/uv_runner_test.go | 6 ++-- .../conda => summer}/fakes/summer.go | 0 pkg/summer/summer.go | 13 +++++++ 9 files changed, 28 insertions(+), 96 deletions(-) delete mode 100644 pkg/packagers/pixi/fakes/summer.go delete mode 100644 pkg/packagers/uv/fakes/summer.go rename pkg/{packagers/conda => summer}/fakes/summer.go (100%) create mode 100644 pkg/summer/summer.go diff --git a/pkg/packagers/conda/conda_runner.go b/pkg/packagers/conda/conda_runner.go index 6ffeed64..941978e6 100644 --- a/pkg/packagers/conda/conda_runner.go +++ b/pkg/packagers/conda/conda_runner.go @@ -16,25 +16,18 @@ import ( "github.com/paketo-buildpacks/packit/v2/scribe" "github.com/paketo-buildpacks/python-packagers/pkg/executable" + "github.com/paketo-buildpacks/python-packagers/pkg/summer" ) -// Summer defines the interface for computing a SHA256 for a set of files -// and/or directories. -// -//go:generate faux --interface Summer --output fakes/summer.go -type Summer interface { - Sum(arg ...string) (string, error) -} - // CondaRunner implements the Runner interface. type CondaRunner struct { logger scribe.Emitter executable executable.Executable - summer Summer + summer summer.Summer } // NewCondaRunner creates an instance of CondaRunner given an Executable, a Summer, and a Logger. -func NewCondaRunner(executable executable.Executable, summer Summer, logger scribe.Emitter) CondaRunner { +func NewCondaRunner(executable executable.Executable, summer summer.Summer, logger scribe.Emitter) CondaRunner { return CondaRunner{ executable: executable, summer: summer, diff --git a/pkg/packagers/conda/conda_runner_test.go b/pkg/packagers/conda/conda_runner_test.go index 66ad9213..8f24f56a 100644 --- a/pkg/packagers/conda/conda_runner_test.go +++ b/pkg/packagers/conda/conda_runner_test.go @@ -19,7 +19,7 @@ import ( executablefakes "github.com/paketo-buildpacks/python-packagers/pkg/executable/fakes" condaenvupdate "github.com/paketo-buildpacks/python-packagers/pkg/packagers/conda" - "github.com/paketo-buildpacks/python-packagers/pkg/packagers/conda/fakes" + summerfakes "github.com/paketo-buildpacks/python-packagers/pkg/summer/fakes" . "github.com/onsi/gomega" . "github.com/paketo-buildpacks/occam/matchers" @@ -35,7 +35,7 @@ func testCondaRunner(t *testing.T, context spec.G, it spec.S) { executable *executablefakes.Executable executions []pexec.Execution - summer *fakes.Summer + summer *summerfakes.Summer runner condaenvupdate.CondaRunner buffer *bytes.Buffer logger scribe.Emitter @@ -63,7 +63,7 @@ func testCondaRunner(t *testing.T, context spec.G, it spec.S) { return nil } - summer = &fakes.Summer{} + summer = &summerfakes.Summer{} buffer = bytes.NewBuffer(nil) logger = scribe.NewEmitter(buffer) runner = condaenvupdate.NewCondaRunner(executable, summer, logger) diff --git a/pkg/packagers/pixi/fakes/summer.go b/pkg/packagers/pixi/fakes/summer.go deleted file mode 100644 index 0ae006ee..00000000 --- a/pkg/packagers/pixi/fakes/summer.go +++ /dev/null @@ -1,34 +0,0 @@ -// SPDX-FileCopyrightText: © 2026 Idiap Research Institute -// SPDX-FileContributor: Samuel Gaist -// -// SPDX-License-Identifier: Apache-2.0 - -package fakes - -import "sync" - -type Summer struct { - SumCall struct { - mutex sync.Mutex - CallCount int - Receives struct { - Arg []string - } - Returns struct { - String string - Error error - } - Stub func(...string) (string, error) - } -} - -func (f *Summer) Sum(param1 ...string) (string, error) { - f.SumCall.mutex.Lock() - defer f.SumCall.mutex.Unlock() - f.SumCall.CallCount++ - f.SumCall.Receives.Arg = param1 - if f.SumCall.Stub != nil { - return f.SumCall.Stub(param1...) - } - return f.SumCall.Returns.String, f.SumCall.Returns.Error -} diff --git a/pkg/packagers/pixi/pixi_runner_test.go b/pkg/packagers/pixi/pixi_runner_test.go index 5e08a846..7b83e631 100644 --- a/pkg/packagers/pixi/pixi_runner_test.go +++ b/pkg/packagers/pixi/pixi_runner_test.go @@ -22,7 +22,7 @@ import ( executablefakes "github.com/paketo-buildpacks/python-packagers/pkg/executable/fakes" pixiinstall "github.com/paketo-buildpacks/python-packagers/pkg/packagers/pixi" - "github.com/paketo-buildpacks/python-packagers/pkg/packagers/pixi/fakes" + summerfakes "github.com/paketo-buildpacks/python-packagers/pkg/summer/fakes" ) func testPixiRunner(t *testing.T, context spec.G, it spec.S) { @@ -35,7 +35,7 @@ func testPixiRunner(t *testing.T, context spec.G, it spec.S) { executable *executablefakes.Executable executions []pexec.Execution - summer *fakes.Summer + summer *summerfakes.Summer runner pixiinstall.PixiRunner buffer *bytes.Buffer logger scribe.Emitter @@ -61,7 +61,7 @@ func testPixiRunner(t *testing.T, context spec.G, it spec.S) { return nil } - summer = &fakes.Summer{} + summer = &summerfakes.Summer{} buffer = bytes.NewBuffer(nil) logger = scribe.NewEmitter(buffer) runner = pixiinstall.NewPixiRunner(executable, summer, logger) diff --git a/pkg/packagers/uv/fakes/summer.go b/pkg/packagers/uv/fakes/summer.go deleted file mode 100644 index 31232cdd..00000000 --- a/pkg/packagers/uv/fakes/summer.go +++ /dev/null @@ -1,33 +0,0 @@ -// SPDX-FileCopyrightText: Copyright (c) 2013-Present CloudFoundry.org Foundation, Inc. All Rights Reserved. -// -// SPDX-License-Identifier: Apache-2.0 - -package fakes - -import "sync" - -type Summer struct { - SumCall struct { - mutex sync.Mutex - CallCount int - Receives struct { - Arg []string - } - Returns struct { - String string - Error error - } - Stub func(...string) (string, error) - } -} - -func (f *Summer) Sum(param1 ...string) (string, error) { - f.SumCall.mutex.Lock() - defer f.SumCall.mutex.Unlock() - f.SumCall.CallCount++ - f.SumCall.Receives.Arg = param1 - if f.SumCall.Stub != nil { - return f.SumCall.Stub(param1...) - } - return f.SumCall.Returns.String, f.SumCall.Returns.Error -} diff --git a/pkg/packagers/uv/uv_runner.go b/pkg/packagers/uv/uv_runner.go index 701a6650..06af121f 100644 --- a/pkg/packagers/uv/uv_runner.go +++ b/pkg/packagers/uv/uv_runner.go @@ -17,25 +17,18 @@ import ( "github.com/paketo-buildpacks/packit/v2/scribe" "github.com/paketo-buildpacks/python-packagers/pkg/executable" + "github.com/paketo-buildpacks/python-packagers/pkg/summer" ) -// Summer defines the interface for computing a SHA256 for a set of files -// and/or directories. -// -//go:generate faux --interface Summer --output fakes/summer.go -type Summer interface { - Sum(arg ...string) (string, error) -} - // UvRunner implements the Runner interface. type UvRunner struct { executable executable.Executable - summer Summer + summer summer.Summer logger scribe.Emitter } // NewUvRunner creates an instance of UvRunner given an Executable and a Logger. -func NewUvRunner(executable executable.Executable, summer Summer, logger scribe.Emitter) UvRunner { +func NewUvRunner(executable executable.Executable, summer summer.Summer, logger scribe.Emitter) UvRunner { return UvRunner{ executable: executable, summer: summer, diff --git a/pkg/packagers/uv/uv_runner_test.go b/pkg/packagers/uv/uv_runner_test.go index 1327c6a6..537221f5 100644 --- a/pkg/packagers/uv/uv_runner_test.go +++ b/pkg/packagers/uv/uv_runner_test.go @@ -20,7 +20,7 @@ import ( executablefakes "github.com/paketo-buildpacks/python-packagers/pkg/executable/fakes" uv "github.com/paketo-buildpacks/python-packagers/pkg/packagers/uv" - "github.com/paketo-buildpacks/python-packagers/pkg/packagers/uv/fakes" + summerfakes "github.com/paketo-buildpacks/python-packagers/pkg/summer/fakes" . "github.com/onsi/gomega" . "github.com/paketo-buildpacks/occam/matchers" @@ -36,7 +36,7 @@ func testUvRunner(t *testing.T, context spec.G, it spec.S) { executable *executablefakes.Executable executions []pexec.Execution - summer *fakes.Summer + summer *summerfakes.Summer runner uv.UvRunner buffer *bytes.Buffer logger scribe.Emitter @@ -64,7 +64,7 @@ func testUvRunner(t *testing.T, context spec.G, it spec.S) { return nil } - summer = &fakes.Summer{} + summer = &summerfakes.Summer{} buffer = bytes.NewBuffer(nil) logger = scribe.NewEmitter(buffer) runner = uv.NewUvRunner(executable, summer, logger) diff --git a/pkg/packagers/conda/fakes/summer.go b/pkg/summer/fakes/summer.go similarity index 100% rename from pkg/packagers/conda/fakes/summer.go rename to pkg/summer/fakes/summer.go diff --git a/pkg/summer/summer.go b/pkg/summer/summer.go new file mode 100644 index 00000000..6be6d278 --- /dev/null +++ b/pkg/summer/summer.go @@ -0,0 +1,13 @@ +// SPDX-FileCopyrightText: Copyright (c) 2013-Present CloudFoundry.org Foundation, Inc. All Rights Reserved. +// +// SPDX-License-Identifier: Apache-2.0 + +package summer + +// Summer defines the interface for computing a SHA256 for a set of files +// and/or directories. +// +//go:generate faux --interface Summer --output fakes/summer.go +type Summer interface { + Sum(arg ...string) (string, error) +}