Skip to content

Commit 025bda5

Browse files
authored
Poetry native support improvement (#340)
1 parent f5f0e93 commit 025bda5

File tree

2 files changed

+76
-14
lines changed

2 files changed

+76
-14
lines changed

cli/cli.go

Lines changed: 48 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -373,26 +373,60 @@ func GetCommands(logger utils.Log) []*clitool.Command {
373373
UsageText: "bi poetry",
374374
Flags: flags,
375375
Action: func(context *clitool.Context) (err error) {
376-
// Use Poetry implementation for proper dependency collection
377-
config := flexpack.PoetryConfig{
378-
WorkingDirectory: ".",
379-
IncludeDevDependencies: false, // Can be made configurable later
376+
// Check if FlexPack implementation should be used
377+
if flexpack.IsFlexPackEnabled() {
378+
// Use Poetry FlexPack implementation for proper dependency collection
379+
config := flexpack.PoetryConfig{
380+
WorkingDirectory: ".",
381+
IncludeDevDependencies: false, // Can be made configurable later
382+
}
383+
384+
// Create Poetry instance
385+
poetryFlex, err := flexpack.NewPoetryFlexPack(config)
386+
if err != nil {
387+
return fmt.Errorf("failed to create Poetry instance: %w", err)
388+
}
389+
390+
// Collect build info
391+
buildInfo, err := poetryFlex.CollectBuildInfo("poetry-build", "1")
392+
if err != nil {
393+
return fmt.Errorf("failed to collect build info: %w", err)
394+
}
395+
396+
// Print the build info
397+
return printBuildInfo(buildInfo, context.String(formatFlag))
380398
}
381399

382-
// Create Poetry instance
383-
poetryFlex, err := flexpack.NewPoetryFlexPack(config)
400+
// Use traditional build-info-go implementation
401+
service := build.NewBuildInfoService()
402+
service.SetLogger(logger)
403+
bld, err := service.GetOrCreateBuild("poetry-build", "1")
404+
if err != nil {
405+
return
406+
}
407+
defer func() {
408+
err = errors.Join(err, bld.Clean())
409+
}()
410+
pythonModule, err := bld.AddPythonModule("", pythonutils.Poetry)
384411
if err != nil {
385-
return fmt.Errorf("failed to create Poetry instance: %w", err)
412+
return
386413
}
387-
388-
// Collect build info
389-
buildInfo, err := poetryFlex.CollectBuildInfo("poetry-build", "1")
414+
filteredArgs := filterCliFlags(context.Args().Slice(), flags)
415+
if len(filteredArgs) > 0 && (filteredArgs[0] == "install" || filteredArgs[0] == "publish") {
416+
err = pythonModule.RunInstallAndCollectDependencies(filteredArgs[1:])
417+
if err != nil {
418+
return
419+
}
420+
return printBuild(bld, context.String(formatFlag))
421+
} else if len(filteredArgs) > 0 {
422+
return exec.Command("poetry", filteredArgs...).Run()
423+
}
424+
// If no args, just collect dependencies
425+
err = pythonModule.RunInstallAndCollectDependencies([]string{})
390426
if err != nil {
391-
return fmt.Errorf("failed to collect build info: %w", err)
427+
return
392428
}
393-
394-
// Print the build info
395-
return printBuildInfo(buildInfo, context.String(formatFlag))
429+
return printBuild(bld, context.String(formatFlag))
396430
},
397431
},
398432
}

flexpack/poetry_flexpack.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,15 @@ type PoetryFlexPack struct {
2929
}
3030

3131
// PoetryPyProjectToml represents the structure of pyproject.toml file for Poetry
32+
// Supports both Poetry 1.x format ([tool.poetry]) and Poetry 2.x format ([project])
3233
type PoetryPyProjectToml struct {
34+
// Poetry 2.x format (PEP 621)
35+
Project struct {
36+
Name string `toml:"name"`
37+
Version string `toml:"version"`
38+
Dependencies []string `toml:"dependencies"`
39+
} `toml:"project"`
40+
// Poetry 1.x format
3341
Tool struct {
3442
Poetry struct {
3543
Name string `toml:"name"`
@@ -194,6 +202,7 @@ func (pf *PoetryFlexPack) CalculateRequestedBy() map[string][]string {
194202
}
195203

196204
// loadPyProjectToml loads and parses the pyproject.toml file
205+
// Supports both Poetry 1.x format ([tool.poetry]) and Poetry 2.x format ([project])
197206
func (pf *PoetryFlexPack) loadPyProjectToml() error {
198207
pyprojectPath := filepath.Join(pf.config.WorkingDirectory, "pyproject.toml")
199208
data, err := os.ReadFile(pyprojectPath)
@@ -204,8 +213,27 @@ func (pf *PoetryFlexPack) loadPyProjectToml() error {
204213
if err := toml.Unmarshal(data, pf.pyprojectData); err != nil {
205214
return fmt.Errorf("failed to parse pyproject.toml: %w", err)
206215
}
216+
217+
// Try Poetry 1.x format first ([tool.poetry])
207218
pf.projectName = pf.pyprojectData.Tool.Poetry.Name
208219
pf.projectVersion = pf.pyprojectData.Tool.Poetry.Version
220+
221+
// Fallback to Poetry 2.x / PEP 621 format ([project])
222+
if pf.projectName == "" {
223+
pf.projectName = pf.pyprojectData.Project.Name
224+
}
225+
if pf.projectVersion == "" {
226+
pf.projectVersion = pf.pyprojectData.Project.Version
227+
}
228+
229+
// Validate that we found name and version
230+
if pf.projectName == "" {
231+
return fmt.Errorf("project name not found in pyproject.toml (checked [tool.poetry.name] and [project.name])")
232+
}
233+
if pf.projectVersion == "" {
234+
return fmt.Errorf("project version not found in pyproject.toml (checked [tool.poetry.version] and [project.version])")
235+
}
236+
209237
return nil
210238
}
211239

0 commit comments

Comments
 (0)