feat: deprecate envvar segment

favors text in a more generic way
This commit is contained in:
Jan De Dobbeleer 2021-12-26 19:36:04 +01:00 committed by Jan De Dobbeleer
parent ce04362bb4
commit 3c40c04d36
10 changed files with 98 additions and 172 deletions

View file

@ -1,61 +0,0 @@
---
id: environment
title: Environment Variable
sidebar_label: Environment Variable
---
## What
Show the content of an environment variable.
Can be used to visualize a local settings/context unavailable to Go my Posh otherwise.
For example, in PowerShell, adding the below configuration to a block and extending the prompt
function to set an environment variable before the prompt, you can work a bit of magic.
```powershell
[ScriptBlock]$Prompt = {
$realLASTEXITCODE = $global:LASTEXITCODE
$env:POSH = "hello from Powershell"
& "C:\tools\oh-my-posh.exe" -config "~/downloadedtheme.json" -error $realLASTEXITCODE -pwd $PWD
$global:LASTEXITCODE = $realLASTEXITCODE
Remove-Variable realLASTEXITCODE -Confirm:$false
}
```
If you're using the PowerShell module, you can override a function to achieve the same effect.
make sure to do this after importing `go-my-posh` and you're good to go.
```powershell
function Set-EnvVar {
$env:POSH=$(Get-Date)
}
New-Alias -Name 'Set-PoshContext' -Value 'Set-EnvVar' -Scope Global -Force
```
The segment will show when the value of the environment variable isn't empty.
## Sample *Configuration*
```json
{
"type": "envvar",
"style": "powerline",
"powerline_symbol": "\uE0B0",
"foreground": "#ffffff",
"background": "#0077c2",
"properties": {
"var_name": "POSH"
}
}
```
- var_name: `string` - the name of the environment variable
- template: `string` - A go [text/template][go-text-template] template extended with [sprig][sprig] utilizing the
properties below - defaults to the value of the environment variable.
## Template Properties
- `.Value`: `string` - the value of the environment variable
[go-text-template]: https://golang.org/pkg/text/template/
[sprig]: https://masterminds.github.io/sprig/

View file

@ -22,11 +22,23 @@ Display text.
} }
``` ```
:::tip
If you're using PowerShell, you can override a function to populate environment variables before the
prompt is rendered.
```powershell
function Set-EnvVar {
$env:POSH=$(Get-Date)
}
New-Alias -Name 'Set-PoshContext' -Value 'Set-EnvVar' -Scope Global -Force
```
:::
## Properties ## Properties
- text: `string` - text/icon to display. Accepts [coloring foreground][coloring] just like `prefix` and `postfix`. - template: `string` - text/icon to display. Powered by go [text/template][go-text-template] templates extended
Powered by go [text/template][go-text-template] templates extended with [sprig][sprig] utilizing the with [sprig][sprig] utilizing the properties below.
properties below.
## Template Properties ## Template Properties

View file

@ -46,7 +46,6 @@ module.exports = {
"crystal", "crystal",
"dart", "dart",
"dotnet", "dotnet",
"environment",
"executiontime", "executiontime",
"exit", "exit",
"git", "git",

View file

@ -25,6 +25,14 @@ func (p properties) getOneOfBool(property, legacyProperty Property, defaultValue
return p.getBool(property, defaultValue) return p.getBool(property, defaultValue)
} }
func (p properties) getOneOfString(property, legacyProperty Property, defaultValue string) string {
_, found := p[legacyProperty]
if found {
return p.getString(legacyProperty, defaultValue)
}
return p.getString(property, defaultValue)
}
func (p properties) hasOneOf(properties ...Property) bool { func (p properties) hasOneOf(properties ...Property) bool {
for _, property := range properties { for _, property := range properties {
if _, found := p[property]; found { if _, found := p[property]; found {
@ -405,3 +413,44 @@ const (
// DisplayPackageManager shows if NPM or Yarn is used // DisplayPackageManager shows if NPM or Yarn is used
DisplayPackageManager Property = "display_package_manager" DisplayPackageManager Property = "display_package_manager"
) )
// Environment Variable
type envvar struct {
props properties
env environmentInfo
Value string
}
const (
// VarName name of the variable
VarName Property = "var_name"
)
func (e *envvar) enabled() bool {
name := e.props.getString(VarName, "")
e.Value = e.env.getenv(name)
return e.Value != ""
}
func (e *envvar) string() string {
segmentTemplate := e.props.getString(SegmentTemplate, "")
if len(segmentTemplate) == 0 {
return e.Value
}
template := &textTemplate{
Template: segmentTemplate,
Context: e,
Env: e.env,
}
text, err := template.render()
if err != nil {
return err.Error()
}
return text
}
func (e *envvar) init(props properties, env environmentInfo) {
e.props = props
e.env = env
}

View file

@ -762,3 +762,34 @@ func TestPythonVirtualEnv(t *testing.T) {
assert.Equal(t, tc.Expected, python.string(), tc.Case) assert.Equal(t, tc.Expected, python.string(), tc.Case)
} }
} }
// Environment Variable
func TestEnvvarAvailable(t *testing.T) {
name := "HERP"
expected := "derp"
env := new(MockedEnvironment)
env.On("getenv", name).Return(expected)
e := &envvar{
env: env,
props: map[Property]interface{}{
VarName: name,
},
}
assert.True(t, e.enabled())
assert.Equal(t, expected, e.string())
}
func TestEnvvarNotAvailable(t *testing.T) {
name := "HERP"
expected := ""
env := new(MockedEnvironment)
env.On("getenv", name).Return(expected)
e := &envvar{
env: env,
props: map[Property]interface{}{
VarName: name,
},
}
assert.False(t, e.enabled())
}

View file

@ -1,40 +0,0 @@
package main
type envvar struct {
props properties
env environmentInfo
Value string
}
const (
// VarName name of the variable
VarName Property = "var_name"
)
func (e *envvar) enabled() bool {
name := e.props.getString(VarName, "")
e.Value = e.env.getenv(name)
return e.Value != ""
}
func (e *envvar) string() string {
segmentTemplate := e.props.getString(SegmentTemplate, "")
if len(segmentTemplate) == 0 {
return e.Value
}
template := &textTemplate{
Template: segmentTemplate,
Context: e,
Env: e.env,
}
text, err := template.render()
if err != nil {
return err.Error()
}
return text
}
func (e *envvar) init(props properties, env environmentInfo) {
e.props = props
e.env = env
}

View file

@ -1,36 +0,0 @@
package main
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestEnvvarAvailable(t *testing.T) {
name := "HERP"
expected := "derp"
env := new(MockedEnvironment)
env.On("getenv", name).Return(expected)
e := &envvar{
env: env,
props: map[Property]interface{}{
VarName: name,
},
}
assert.True(t, e.enabled())
assert.Equal(t, expected, e.string())
}
func TestEnvvarNotAvailable(t *testing.T) {
name := "HERP"
expected := ""
env := new(MockedEnvironment)
env.On("getenv", name).Return(expected)
e := &envvar{
env: env,
props: map[Property]interface{}{
VarName: name,
},
}
assert.False(t, e.enabled())
}

View file

@ -12,7 +12,7 @@ const (
) )
func (t *text) enabled() bool { func (t *text) enabled() bool {
textProperty := t.props.getString(TextProperty, "!!text property not defined!!") textProperty := t.props.getOneOfString(TextProperty, SegmentTemplate, "!!text property not defined!!")
template := &textTemplate{ template := &textTemplate{
Template: textProperty, Template: textProperty,
Context: t, Context: t,

View file

@ -71,15 +71,14 @@
"type": "rprompt", "type": "rprompt",
"segments": [ "segments": [
{ {
"type": "envvar", "type": "text",
"style": "diamond", "style": "diamond",
"leading_diamond": "\uE0B2", "leading_diamond": "\uE0B2",
"trailing_diamond": "\uE0B4", "trailing_diamond": "\uE0B4",
"foreground": "#ffffff", "foreground": "#ffffff",
"background": "#1f4b8e", "background": "#1f4b8e",
"properties": { "properties": {
"var_name": "DAYS", "template": "\uf1bb {{ .Env.DAYS }} days till Christmas"
"template": "\uf1bb {{ .Value }} days till Christmas"
} }
} }
] ]

View file

@ -160,7 +160,6 @@
"shell", "shell",
"node", "node",
"os", "os",
"envvar",
"az", "az",
"kubectl", "kubectl",
"dotnet", "dotnet",
@ -422,32 +421,6 @@
} }
} }
}, },
{
"if": {
"properties": {
"type": { "const": "envvar" }
}
},
"then": {
"title": "Environment Variable Segment",
"description": "https://ohmyposh.dev/docs/environment",
"properties": {
"properties": {
"properties": {
"template": {
"$ref": "#/definitions/template"
},
"var_name": {
"type": "string",
"title": "Variable Name",
"description": "The name of the environment variable",
"default": ""
}
}
}
}
}
},
{ {
"if": { "if": {
"properties": { "properties": {