From 9e470e52052170f205f7d7e7b7d045de3c0f58d7 Mon Sep 17 00:00:00 2001 From: Oleksandr Babieiev <64398691+oleksbabieiev@users.noreply.github.com> Date: Mon, 27 Nov 2023 14:30:07 +0100 Subject: [PATCH] feat(project): add PEP 621 support for Python projects BREAKING CHANGE: this replaces the `poetry` `.Type` value with `python`. Segment templates matching the `poetry` type will need to be updated to match the new `python` type. --- src/segments/project.go | 21 ++++++++----- src/segments/project_test.go | 52 +++++++++++++++++++++++++------ website/docs/segments/project.mdx | 6 ++-- 3 files changed, 60 insertions(+), 19 deletions(-) diff --git a/src/segments/project.go b/src/segments/project.go index b3af9a5d..a4cef159 100644 --- a/src/segments/project.go +++ b/src/segments/project.go @@ -33,9 +33,10 @@ type CargoTOML struct { Package ProjectData } -// Python Poetry package +// Python package type PyProjectTOML struct { - Tool PyProjectToolTOML + Project ProjectData + Tool PyProjectToolTOML } type PyProjectToolTOML struct { @@ -95,9 +96,9 @@ func (n *Project) Init(props properties.Properties, env platform.Environment) { Fetcher: n.getCargoPackage, }, { - Name: "poetry", + Name: "python", Files: []string{"pyproject.toml"}, - Fetcher: n.getPoetryPackage, + Fetcher: n.getPythonPackage, }, { Name: "php", @@ -165,7 +166,7 @@ func (n *Project) getCargoPackage(item ProjectItem) *ProjectData { } } -func (n *Project) getPoetryPackage(item ProjectItem) *ProjectData { +func (n *Project) getPythonPackage(item ProjectItem) *ProjectData { content := n.env.FileContent(item.Files[0]) var data PyProjectTOML @@ -175,9 +176,15 @@ func (n *Project) getPoetryPackage(item ProjectItem) *ProjectData { return nil } + if len(data.Tool.Poetry.Version) != 0 || len(data.Tool.Poetry.Name) != 0 { + return &ProjectData{ + Version: data.Tool.Poetry.Version, + Name: data.Tool.Poetry.Name, + } + } return &ProjectData{ - Version: data.Tool.Poetry.Version, - Name: data.Tool.Poetry.Name, + Version: data.Project.Version, + Name: data.Project.Name, } } diff --git a/src/segments/project_test.go b/src/segments/project_test.go index 698a199d..489a6e13 100644 --- a/src/segments/project_test.go +++ b/src/segments/project_test.go @@ -92,21 +92,37 @@ func TestPackage(t *testing.T) { PackageContents: "[package]\nname=\"test\"\nversion=\"3.2.1\"\n", }, { - Case: "1.0.0 poetry", + Case: "1.0.0 python (poetry)", ExpectedEnabled: true, ExpectedString: "\uf487 1.0.0 test", - Name: "poetry", + Name: "python", File: "pyproject.toml", PackageContents: "[tool.poetry]\nname=\"test\"\nversion=\"1.0.0\"\n", }, { - Case: "3.2.1 poetry", + Case: "3.2.1 python (poetry)", ExpectedEnabled: true, ExpectedString: "\uf487 3.2.1 test", - Name: "poetry", + Name: "python", File: "pyproject.toml", PackageContents: "[tool.poetry]\nname=\"test\"\nversion=\"3.2.1\"\n", }, + { + Case: "1.0.0 python (pep621)", + ExpectedEnabled: true, + ExpectedString: "\uf487 1.0.0 test", + Name: "python", + File: "pyproject.toml", + PackageContents: "[project]\nname=\"test\"\nversion=\"1.0.0\"\n", + }, + { + Case: "3.2.1 python (pep621)", + ExpectedEnabled: true, + ExpectedString: "\uf487 3.2.1 test", + Name: "python", + File: "pyproject.toml", + PackageContents: "[project]\nname=\"test\"\nversion=\"3.2.1\"\n", + }, { Case: "No version present node.js", ExpectedEnabled: true, @@ -124,13 +140,21 @@ func TestPackage(t *testing.T) { PackageContents: "[package]\nname=\"test\"\n", }, { - Case: "No version present poetry", + Case: "No version present python (poetry)", ExpectedEnabled: true, ExpectedString: "test", - Name: "poetry", + Name: "python", File: "pyproject.toml", PackageContents: "[tool.poetry]\nname=\"test\"\n", }, + { + Case: "No version present python (pep621)", + ExpectedEnabled: true, + ExpectedString: "test", + Name: "python", + File: "pyproject.toml", + PackageContents: "[project]\nname=\"test\"\n", + }, { Case: "No name present node.js", ExpectedEnabled: true, @@ -148,13 +172,21 @@ func TestPackage(t *testing.T) { PackageContents: "[package]\nversion=\"1.0.0\"\n", }, { - Case: "No name present poetry", + Case: "No name present python (poetry)", ExpectedEnabled: true, ExpectedString: "\uf487 1.0.0", - Name: "poetry", + Name: "python", File: "pyproject.toml", PackageContents: "[tool.poetry]\nversion=\"1.0.0\"\n", }, + { + Case: "No name present python (pep621)", + ExpectedEnabled: true, + ExpectedString: "\uf487 1.0.0", + Name: "python", + File: "pyproject.toml", + PackageContents: "[project]\nversion=\"1.0.0\"\n", + }, { Case: "Empty project package node.js", ExpectedEnabled: true, @@ -170,9 +202,9 @@ func TestPackage(t *testing.T) { PackageContents: "", }, { - Case: "Empty project package poetry", + Case: "Empty project package python", ExpectedEnabled: true, - Name: "poetry", + Name: "python", File: "pyproject.toml", PackageContents: "", }, diff --git a/website/docs/segments/project.mdx b/website/docs/segments/project.mdx index 239cc615..bd2ae74a 100644 --- a/website/docs/segments/project.mdx +++ b/website/docs/segments/project.mdx @@ -12,7 +12,7 @@ Supports: - Node.js project (`package.json`) - Cargo project (`Cargo.toml`) -- Poetry project (`pyproject.toml`) +- Python project (`pyproject.toml`, supports metadata defined according to [PEP 621][pep621-standard] or [Poetry][poetry-standard]) - PHP project (`composer.json`) - Any nuspec based project (`*.nuspec`, first file match info is displayed) - .NET project (`*.sln`, `*.slnf`, `*.csproj`, `*.vbproj` or `*.fsproj`, first file match info is displayed) @@ -55,10 +55,12 @@ import Config from "@site/src/components/Config.js"; | Name | Type | Description | | ---------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `.Type` | `string` | The type of project: | +| `.Type` | `string` | The type of project: | | `.Version` | `string` | The version of your project | | `.Target` | `string` | The target framwork/language version of your project | | `.Name` | `string` | The name of your project | | `.Error` | `string` | The error context when we can't fetch the project info | [templates]: /docs/configuration/templates +[pep621-standard]: https://peps.python.org/pep-0621/ +[poetry-standard]: https://python-poetry.org/docs/pyproject/