feat(python): make parent folder fallback optional

This commit is contained in:
rocky@HP_OMEN 2024-02-28 12:45:40 +00:00 committed by Jan De Dobbeleer
parent 8401da66e5
commit 21df976c2f
3 changed files with 36 additions and 11 deletions

View file

@ -21,6 +21,7 @@ const (
// FetchVirtualEnv fetches the virtual env // FetchVirtualEnv fetches the virtual env
FetchVirtualEnv properties.Property = "fetch_virtual_env" FetchVirtualEnv properties.Property = "fetch_virtual_env"
UsePythonVersionFile properties.Property = "use_python_version_file" UsePythonVersionFile properties.Property = "use_python_version_file"
FolderNameFallback properties.Property = "folder_name_fallback"
) )
func (p *Python) Template() string { func (p *Python) Template() string {
@ -74,6 +75,7 @@ func (p *Python) loadContext() {
"CONDA_DEFAULT_ENV", "CONDA_DEFAULT_ENV",
} }
folderNameFallback := p.language.props.GetBool(FolderNameFallback, true)
defaultVenvNames := []string{ defaultVenvNames := []string{
".venv", ".venv",
"venv", "venv",
@ -87,8 +89,7 @@ func (p *Python) loadContext() {
} }
name := platform.Base(p.language.env, venv) name := platform.Base(p.language.env, venv)
if folderNameFallback && slices.Contains(defaultVenvNames, name) {
if slices.Contains(defaultVenvNames, name) {
venv = strings.TrimSuffix(venv, name) venv = strings.TrimSuffix(venv, name)
name = platform.Base(p.language.env, venv) name = platform.Base(p.language.env, venv)
} }

View file

@ -150,14 +150,36 @@ func TestPythonPythonInContext(t *testing.T) {
func TestPythonVirtualEnvIgnoreDefaultVenvNames(t *testing.T) { func TestPythonVirtualEnvIgnoreDefaultVenvNames(t *testing.T) {
cases := []struct { cases := []struct {
VirtualEnvName string Expected string
FolderNameFallback bool
VirtualEnvName string
}{ }{
{VirtualEnvName: "/path/to/folder/.venv"}, {
{VirtualEnvName: "/path/to/folder/venv"}, Expected: "folder",
FolderNameFallback: true,
VirtualEnvName: "/path/to/folder/.venv",
},
{
Expected: "folder",
FolderNameFallback: true,
VirtualEnvName: "/path/to/folder/venv",
},
{
Expected: ".venv",
FolderNameFallback: false,
VirtualEnvName: "/path/to/folder/.venv",
},
{
Expected: "venv",
FolderNameFallback: false,
VirtualEnvName: "/path/to/folder/venv",
},
} }
for _, tc := range cases { for _, tc := range cases {
env := new(mock.MockedEnvironment) params := &mockedLanguageParams{}
env, props := getMockedLanguageEnv(params)
env.On("GOOS").Return("") env.On("GOOS").Return("")
env.On("PathSeparator").Return("/") env.On("PathSeparator").Return("/")
env.On("CommandPath", mock2.Anything).Return("") env.On("CommandPath", mock2.Anything).Return("")
@ -167,9 +189,12 @@ func TestPythonVirtualEnvIgnoreDefaultVenvNames(t *testing.T) {
env.On("Getenv", "CONDA_DEFAULT_ENV").Return("") env.On("Getenv", "CONDA_DEFAULT_ENV").Return("")
env.On("Getenv", "PYENV_VERSION").Return("") env.On("Getenv", "PYENV_VERSION").Return("")
env.On("HasParentFilePath", ".python-version").Return(&platform.FileInfo{}, errors.New("no match at root level")) env.On("HasParentFilePath", ".python-version").Return(&platform.FileInfo{}, errors.New("no match at root level"))
props[FolderNameFallback] = tc.FolderNameFallback
python := &Python{} python := &Python{}
python.Init(properties.Map{}, env) python.Init(props, env)
python.loadContext() python.loadContext()
assert.Equal(t, "folder", python.Venv) assert.Equal(t, tc.Expected, python.Venv)
} }
} }

View file

@ -9,8 +9,6 @@ sidebar_label: Python
Display the currently active python version and virtualenv. Display the currently active python version and virtualenv.
Supports conda, virtualenv and pyenv (if python points to pyenv shim). Supports conda, virtualenv and pyenv (if python points to pyenv shim).
If your virtual environment is a directory named `venv` or `.venv`, the virtual environment's name will be the parent directory.
## Sample Configuration ## Sample Configuration
import Config from "@site/src/components/Config.js"; import Config from "@site/src/components/Config.js";
@ -38,8 +36,9 @@ import Config from "@site/src/components/Config.js";
| `display_mode` | `string` | <ul><li>`always`: the segment is always displayed</li><li>`files`: the segment is only displayed when one of the following files is present:<ul><li>`*.py`</li><li>`*.ipynb`</li><li>`pyproject.toml`</li><li>`venv.bak`</li><li>`venv`</li><li>`.venv`</li></ul></li><li>`environment`: the segment is only displayed when a virtual env is present (**default**)</li><li>`context`: the segment is only displayed when either `environment` or `files` is active</li></ul> | | `display_mode` | `string` | <ul><li>`always`: the segment is always displayed</li><li>`files`: the segment is only displayed when one of the following files is present:<ul><li>`*.py`</li><li>`*.ipynb`</li><li>`pyproject.toml`</li><li>`venv.bak`</li><li>`venv`</li><li>`.venv`</li></ul></li><li>`environment`: the segment is only displayed when a virtual env is present (**default**)</li><li>`context`: the segment is only displayed when either `environment` or `files` is active</li></ul> |
| `version_url_template` | `string` | a go [text/template][go-text-template] [template][templates] that creates the URL of the version info / release notes | | `version_url_template` | `string` | a go [text/template][go-text-template] [template][templates] that creates the URL of the version info / release notes |
| `extensions` | `[]string` | allows to override the default list of file extensions to validate | | `extensions` | `[]string` | allows to override the default list of file extensions to validate |
| `folders` | `[]string` | allows to override the list of folder names to validate | | `folders` | `[]string` | allows to override the list of folder names to validate |
| `cache_version` | `boolean` | cache the executable's version or not - defaults to `false` | | `cache_version` | `boolean` | cache the executable's version or not - defaults to `false` |
| `folder_name_fallback` | `boolean` | instead of `venv` or `.venv` (case sensitive), use the parent folder name as the virtual environment's name or not - defaults to `true` |
## Template ([info][templates]) ## Template ([info][templates])