diff --git a/build.go b/build.go index 35fd2da..57ab2c5 100644 --- a/build.go +++ b/build.go @@ -34,72 +34,78 @@ func Build( var results []packit.BuildResult - for _, entry := range context.Plan.Entries { - logger.Title("Handling %s", entry.Name) - parameters, ok := buildParameters[entry.Name] - - if !ok { - return packit.BuildResult{}, packit.Fail.WithMessage("missing parameters for: %s", entry.Name) - } - - switch entry.Name { - case pip.Pip: - result, err := pip.Build( - parameters.(pip.PipBuildParameters), - commonBuildParameters, - )(context) - - if err != nil { - return packit.BuildResult{}, err + orderedInstallers := []string{pip.Pip, pipenv.Pipenv, poetry.PoetryDependency, miniconda.Conda, uv.Uv} + + for _, installer := range orderedInstallers { + for _, entry := range context.Plan.Entries { + if entry.Name == installer { + logger.Title("Handling %s", entry.Name) + parameters, ok := buildParameters[entry.Name] + + if !ok { + return packit.BuildResult{}, packit.Fail.WithMessage("missing parameters for: %s", entry.Name) + } + + switch entry.Name { + case pip.Pip: + result, err := pip.Build( + parameters.(pip.PipBuildParameters), + commonBuildParameters, + )(context) + + if err != nil { + return packit.BuildResult{}, err + } + results = append(results, result) + + case pipenv.Pipenv: + result, err := pipenv.Build( + parameters.(pipenv.PipEnvBuildParameters), + commonBuildParameters, + )(context) + + if err != nil { + return packit.BuildResult{}, err + } + results = append(results, result) + + case poetry.PoetryDependency: + result, err := poetry.Build( + parameters.(poetry.PoetryBuildParameters), + commonBuildParameters, + )(context) + + if err != nil { + return packit.BuildResult{}, err + } + results = append(results, result) + + case miniconda.Conda: + result, err := miniconda.Build( + parameters.(miniconda.CondaBuildParameters), + commonBuildParameters, + )(context) + + if err != nil { + return packit.BuildResult{}, err + } + results = append(results, result) + + case uv.Uv: + result, err := uv.Build( + parameters.(uv.UvBuildParameters), + commonBuildParameters, + )(context) + + if err != nil { + return packit.BuildResult{}, err + } + results = append(results, result) + + default: + return packit.BuildResult{}, packit.Fail.WithMessage("unknown plan: %s", entry.Name) + } } - results = append(results, result) - - case pipenv.Pipenv: - result, err := pipenv.Build( - parameters.(pipenv.PipEnvBuildParameters), - commonBuildParameters, - )(context) - - if err != nil { - return packit.BuildResult{}, err - } - results = append(results, result) - - case miniconda.Conda: - result, err := miniconda.Build( - parameters.(miniconda.CondaBuildParameters), - commonBuildParameters, - )(context) - - if err != nil { - return packit.BuildResult{}, err - } - results = append(results, result) - - case poetry.PoetryDependency: - result, err := poetry.Build( - parameters.(poetry.PoetryBuildParameters), - commonBuildParameters, - )(context) - - if err != nil { - return packit.BuildResult{}, err - } - results = append(results, result) - - case uv.Uv: - result, err := uv.Build( - parameters.(uv.UvBuildParameters), - commonBuildParameters, - )(context) - - if err != nil { - return packit.BuildResult{}, err - } - results = append(results, result) - - default: - return packit.BuildResult{}, packit.Fail.WithMessage("unknown plan: %s", entry.Name) } } diff --git a/build_test.go b/build_test.go index 3ac7ec1..5ea7775 100644 --- a/build_test.go +++ b/build_test.go @@ -350,6 +350,32 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { }, 1, }, + { + packit.BuildpackPlan{ + Entries: []packit.BuildpackPlanEntry{ + { + Name: pip.Pip, + }, + { + Name: pipenv.Pipenv, + }, + }, + }, + 3, + }, + { + packit.BuildpackPlan{ + Entries: []packit.BuildpackPlanEntry{ + { + Name: pip.Pip, + }, + { + Name: poetry.PoetryDependency, + }, + }, + }, + 3, + }, } Expect(os.WriteFile(filepath.Join(workingDir, "x.py"), []byte{}, os.ModePerm)).To(Succeed()) Expect(os.WriteFile(filepath.Join(workingDir, "pyproject.toml"), []byte(""), 0755)).To(Succeed()) @@ -368,6 +394,42 @@ func testBuild(t *testing.T, context spec.G, it spec.S) { } }) + it("runs the build process and returns layers in expected order", func() { + orderTestPlans := []packit.BuildpackPlan{ + { + Entries: []packit.BuildpackPlanEntry{ + { + Name: pipenv.Pipenv, + }, + { + Name: pip.Pip, + }, + }, + }, + { + Entries: []packit.BuildpackPlanEntry{ + { + Name: poetry.PoetryDependency, + }, + { + Name: pip.Pip, + }, + }, + }, + } + for _, testPlan := range orderTestPlans { + logger.Detail("Doing: %s", testPlan) + buildContext.Plan = testPlan + result, err := build(buildContext) + Expect(err).NotTo(HaveOccurred()) + + layers := result.Layers + Expect(layers[0].Name).To(Equal(pip.Pip)) + // Pip adds two layers + Expect(layers[2].Name).To(Equal(testPlan.Entries[0].Name)) + } + }) + it("fails if packager parameters is missing", func() { packagerParameters := map[string]pythoninstallers.PackagerParameters{}