feat: expose segment output text

resolves #5750
This commit is contained in:
Jan De Dobbeleer 2024-10-22 12:22:40 +02:00 committed by Jan De Dobbeleer
parent d4054b04d6
commit 9f576507b1
145 changed files with 1245 additions and 1873 deletions

View file

@ -81,6 +81,7 @@ func TestMigratePropertyKey(t *testing.T) {
type MockedWriter struct { type MockedWriter struct {
template string template string
text string
} }
func (m *MockedWriter) Enabled() bool { func (m *MockedWriter) Enabled() bool {
@ -91,6 +92,14 @@ func (m *MockedWriter) Template() string {
return m.template return m.template
} }
func (m *MockedWriter) Text() string {
return m.text
}
func (m *MockedWriter) SetText(text string) {
m.text = text
}
func (m *MockedWriter) Init(_ properties.Properties, _ runtime.Environment) {} func (m *MockedWriter) Init(_ properties.Properties, _ runtime.Environment) {}
func TestIconOverride(t *testing.T) { func TestIconOverride(t *testing.T) {

View file

@ -43,7 +43,6 @@ type Segment struct {
Cache *cache.Config `json:"cache,omitempty" toml:"cache,omitempty"` Cache *cache.Config `json:"cache,omitempty" toml:"cache,omitempty"`
Filler string `json:"filler,omitempty" toml:"filler,omitempty"` Filler string `json:"filler,omitempty" toml:"filler,omitempty"`
styleCache SegmentStyle styleCache SegmentStyle
Text string `json:"-" toml:"-"`
name string name string
LeadingDiamond string `json:"leading_diamond,omitempty" toml:"leading_diamond,omitempty"` LeadingDiamond string `json:"leading_diamond,omitempty" toml:"leading_diamond,omitempty"`
TrailingDiamond string `json:"trailing_diamond,omitempty" toml:"trailing_diamond,omitempty"` TrailingDiamond string `json:"trailing_diamond,omitempty" toml:"trailing_diamond,omitempty"`
@ -124,17 +123,26 @@ func (segment *Segment) Render() {
return return
} }
segment.Text = segment.string() text := segment.string()
segment.Enabled = len(strings.ReplaceAll(segment.Text, " ", "")) > 0 segment.Enabled = len(strings.ReplaceAll(text, " ", "")) > 0
if !segment.Enabled { if !segment.Enabled {
segment.env.TemplateCache().RemoveSegmentData(segment.Name()) segment.env.TemplateCache().RemoveSegmentData(segment.Name())
return return
} }
segment.writer.SetText(text)
segment.setCache() segment.setCache()
} }
func (segment *Segment) Text() string {
return segment.writer.Text()
}
func (segment *Segment) SetText(text string) {
segment.writer.SetText(text)
}
func (segment *Segment) ResolveForeground() color.Ansi { func (segment *Segment) ResolveForeground() color.Ansi {
if len(segment.ForegroundTemplates) != 0 { if len(segment.ForegroundTemplates) != 0 {
match := segment.ForegroundTemplates.FirstMatch(segment.writer, segment.Foreground.String()) match := segment.ForegroundTemplates.FirstMatch(segment.writer, segment.Foreground.String())
@ -202,25 +210,17 @@ func (segment *Segment) restoreCache() bool {
return false return false
} }
text, OK := segment.env.Session().Get(segment.textCacheKey()) data, OK := segment.env.Session().Get(segment.cacheKey())
if !OK { if !OK {
return false return false
} }
segment.env.DebugF("restored %s segment from cache", segment.Name())
segment.Text = text
segment.Enabled = true
data, OK := segment.env.Session().Get(segment.writerCacheKey())
if !OK {
return true
}
err := json.Unmarshal([]byte(data), &segment.writer) err := json.Unmarshal([]byte(data), &segment.writer)
if err != nil { if err != nil {
segment.env.Error(err) segment.env.Error(err)
} }
segment.Enabled = true
segment.env.TemplateCache().AddSegmentData(segment.Name(), segment.writer) segment.env.TemplateCache().AddSegmentData(segment.Name(), segment.writer)
return true return true
@ -231,26 +231,17 @@ func (segment *Segment) setCache() {
return return
} }
segment.env.Session().Set(segment.textCacheKey(), segment.Text, segment.Cache.Duration)
data, err := json.Marshal(segment.writer) data, err := json.Marshal(segment.writer)
if err != nil { if err != nil {
segment.env.Error(err) segment.env.Error(err)
return return
} }
segment.env.Session().Set(segment.writerCacheKey(), string(data), segment.Cache.Duration) segment.env.Session().Set(segment.cacheKey(), string(data), segment.Cache.Duration)
} }
func (segment *Segment) textCacheKey() string { func (segment *Segment) cacheKey() string {
return segment.cacheKey("segment_cache_%s") format := "segment_cache_%s"
}
func (segment *Segment) writerCacheKey() string {
return segment.cacheKey("segment_cache_writer_%s")
}
func (segment *Segment) cacheKey(format string) string {
switch segment.Cache.Strategy { switch segment.Cache.Strategy {
case cache.Session: case cache.Session:
return fmt.Sprintf(format, segment.Name()) return fmt.Sprintf(format, segment.Name())

View file

@ -15,6 +15,8 @@ type SegmentType string
type SegmentWriter interface { type SegmentWriter interface {
Enabled() bool Enabled() bool
Template() string Template() string
SetText(text string)
Text() string
Init(props properties.Properties, env runtime.Environment) Init(props properties.Properties, env runtime.Environment)
} }
@ -320,7 +322,11 @@ func (segment *Segment) MapSegmentWithWriter(env runtime.Environment) error {
segment.Properties = make(properties.Map) segment.Properties = make(properties.Map)
} }
if f, ok := Segments[segment.Type]; ok { f, ok := Segments[segment.Type]
if !ok {
return errors.New("unable to map writer")
}
writer := f() writer := f()
wrapper := &properties.Wrapper{ wrapper := &properties.Wrapper{
Properties: segment.Properties, Properties: segment.Properties,
@ -329,6 +335,3 @@ func (segment *Segment) MapSegmentWithWriter(env runtime.Environment) error {
segment.writer = writer segment.writer = writer
return nil return nil
} }
return errors.New("unable to map writer")
}

View file

@ -21,14 +21,16 @@ func (e *Engine) PrintDebug(startTime time.Time, version string) string {
// console title timing // console title timing
titleStartTime := time.Now() titleStartTime := time.Now()
e.Env.Debug("segment: Title") e.Env.Debug("segment: Title")
title := e.getTitleTemplateText()
consoleTitle := &config.Segment{ consoleTitle := &config.Segment{
Alias: "ConsoleTitle", Alias: "ConsoleTitle",
NameLength: 12, NameLength: 12,
Enabled: len(e.Config.ConsoleTitleTemplate) > 0, Enabled: len(e.Config.ConsoleTitleTemplate) > 0,
Text: title,
Duration: time.Since(titleStartTime), Duration: time.Since(titleStartTime),
Type: config.TEXT,
} }
_ = consoleTitle.MapSegmentWithWriter(e.Env)
consoleTitle.SetText(e.getTitleTemplateText())
largestSegmentNameLength := consoleTitle.NameLength largestSegmentNameLength := consoleTitle.NameLength
// render prompt // render prompt

View file

@ -267,7 +267,7 @@ func (e *Engine) renderActiveSegment() {
switch e.activeSegment.ResolveStyle() { switch e.activeSegment.ResolveStyle() {
case config.Plain, config.Powerline: case config.Plain, config.Powerline:
terminal.Write(color.Background, color.Foreground, e.activeSegment.Text) terminal.Write(color.Background, color.Foreground, e.activeSegment.Text())
case config.Diamond: case config.Diamond:
background := color.Transparent background := color.Transparent
@ -276,10 +276,10 @@ func (e *Engine) renderActiveSegment() {
} }
terminal.Write(background, color.Background, e.activeSegment.LeadingDiamond) terminal.Write(background, color.Background, e.activeSegment.LeadingDiamond)
terminal.Write(color.Background, color.Foreground, e.activeSegment.Text) terminal.Write(color.Background, color.Foreground, e.activeSegment.Text())
case config.Accordion: case config.Accordion:
if e.activeSegment.Enabled { if e.activeSegment.Enabled {
terminal.Write(color.Background, color.Foreground, e.activeSegment.Text) terminal.Write(color.Background, color.Foreground, e.activeSegment.Text())
} }
} }

View file

@ -2,9 +2,6 @@ package segments
import ( import (
"path/filepath" "path/filepath"
"github.com/jandedobbeleer/oh-my-posh/src/properties"
"github.com/jandedobbeleer/oh-my-posh/src/runtime"
) )
type Angular struct { type Angular struct {
@ -15,22 +12,16 @@ func (a *Angular) Template() string {
return languageTemplate return languageTemplate
} }
func (a *Angular) Init(props properties.Properties, env runtime.Environment) { func (a *Angular) Enabled() bool {
a.language = language{ a.extensions = []string{"angular.json"}
env: env, a.commands = []*cmd{
props: props,
extensions: []string{"angular.json"},
commands: []*cmd{
{ {
regex: `(?:(?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+).(?P<patch>[0-9]+))))`, regex: `(?:(?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+).(?P<patch>[0-9]+))))`,
getVersion: a.getVersion, getVersion: a.getVersion,
}, },
},
versionURLTemplate: "https://github.com/angular/angular/releases/tag/{{.Full}}",
}
} }
a.versionURLTemplate = "https://github.com/angular/angular/releases/tag/{{.Full}}"
func (a *Angular) Enabled() bool {
return a.language.Enabled() return a.language.Enabled()
} }

View file

@ -6,8 +6,6 @@ import (
"path" "path"
"strings" "strings"
"github.com/jandedobbeleer/oh-my-posh/src/properties"
"github.com/jandedobbeleer/oh-my-posh/src/runtime"
"github.com/spf13/pflag" "github.com/spf13/pflag"
"gopkg.in/yaml.v3" "gopkg.in/yaml.v3"
) )
@ -33,8 +31,7 @@ type ArgocdConfig struct {
} }
type Argocd struct { type Argocd struct {
props properties.Properties base
env runtime.Environment
ArgocdContext ArgocdContext
} }
@ -43,11 +40,6 @@ func (a *Argocd) Template() string {
return NameTemplate return NameTemplate
} }
func (a *Argocd) Init(props properties.Properties, env runtime.Environment) {
a.props = props
a.env = env
}
func (a *Argocd) Enabled() bool { func (a *Argocd) Enabled() bool {
// always parse config instead of using cli to save time // always parse config instead of using cli to save time
configPath := a.getConfigPath() configPath := a.getConfigPath()

View file

@ -37,8 +37,10 @@ func TestArgocdGetConfigFromOpts(t *testing.T) {
env.On("Getenv", argocdOptsEnv).Return(tc.Opts) env.On("Getenv", argocdOptsEnv).Return(tc.Opts)
argocd := &Argocd{ argocd := &Argocd{
base: base{
env: env, env: env,
props: properties.Map{}, props: properties.Map{},
},
} }
config := argocd.getConfigFromOpts() config := argocd.getConfigFromOpts()
assert.Equal(t, tc.Expected, config, tc.Case) assert.Equal(t, tc.Expected, config, tc.Case)
@ -63,8 +65,10 @@ func TestArgocdGetConfigPath(t *testing.T) {
env.On("Getenv", argocdOptsEnv).Return(tc.Opts) env.On("Getenv", argocdOptsEnv).Return(tc.Opts)
argocd := &Argocd{ argocd := &Argocd{
base: base{
env: env, env: env,
props: properties.Map{}, props: properties.Map{},
},
} }
assert.Equal(t, tc.Expected, argocd.getConfigPath()) assert.Equal(t, tc.Expected, argocd.getConfigPath())
} }
@ -159,8 +163,10 @@ users:
env.On("Error", testify_.Anything).Return() env.On("Error", testify_.Anything).Return()
argocd := &Argocd{ argocd := &Argocd{
base: base{
env: env, env: env,
props: properties.Map{}, props: properties.Map{},
},
} }
if len(tc.ExpectedError) > 0 { if len(tc.ExpectedError) > 0 {
_, err := argocd.parseConfig(configFile) _, err := argocd.parseConfig(configFile)
@ -254,10 +260,8 @@ servers:
env.On("Error", testify_.Anything).Return() env.On("Error", testify_.Anything).Return()
env.On("Flags").Return(&runtime.Flags{}) env.On("Flags").Return(&runtime.Flags{})
argocd := &Argocd{ argocd := &Argocd{}
env: env, argocd.Init(properties.Map{}, env)
props: properties.Map{},
}
assert.Equal(t, tc.ExpectedEnabled, argocd.Enabled(), tc.Case) assert.Equal(t, tc.ExpectedEnabled, argocd.Enabled(), tc.Case)

View file

@ -5,12 +5,10 @@ import (
"strings" "strings"
"github.com/jandedobbeleer/oh-my-posh/src/properties" "github.com/jandedobbeleer/oh-my-posh/src/properties"
"github.com/jandedobbeleer/oh-my-posh/src/runtime"
) )
type Aws struct { type Aws struct {
props properties.Properties base
env runtime.Environment
Profile string Profile string
Region string Region string
@ -24,11 +22,6 @@ func (a *Aws) Template() string {
return " {{ .Profile }}{{ if .Region }}@{{ .Region }}{{ end }} " return " {{ .Profile }}{{ if .Region }}@{{ .Region }}{{ end }} "
} }
func (a *Aws) Init(props properties.Properties, env runtime.Environment) {
a.props = props
a.env = env
}
func (a *Aws) Enabled() bool { func (a *Aws) Enabled() bool {
getEnvFirstMatch := func(envs ...string) string { getEnvFirstMatch := func(envs ...string) string {
for _, env := range envs { for _, env := range envs {

View file

@ -66,10 +66,8 @@ func TestAWSSegment(t *testing.T) {
} }
env.On("Flags").Return(&runtime.Flags{}) env.On("Flags").Return(&runtime.Flags{})
aws := &Aws{ aws := &Aws{}
env: env, aws.Init(props, env)
props: props,
}
if tc.Template == "" { if tc.Template == "" {
tc.Template = aws.Template() tc.Template = aws.Template()

View file

@ -7,12 +7,11 @@ import (
"strings" "strings"
"github.com/jandedobbeleer/oh-my-posh/src/properties" "github.com/jandedobbeleer/oh-my-posh/src/properties"
"github.com/jandedobbeleer/oh-my-posh/src/runtime"
) )
type Az struct { type Az struct {
props properties.Properties base
env runtime.Environment
Origin string Origin string
AzureSubscription AzureSubscription
} }
@ -75,11 +74,6 @@ func (a *Az) Template() string {
return NameTemplate return NameTemplate
} }
func (a *Az) Init(props properties.Properties, env runtime.Environment) {
a.props = props
a.env = env
}
func (a *Az) Enabled() bool { func (a *Az) Enabled() bool {
source := a.props.GetString(Source, FirstMatch) source := a.props.GetString(Source, FirstMatch)
switch source { switch source {

View file

@ -1,10 +1,5 @@
package segments package segments
import (
"github.com/jandedobbeleer/oh-my-posh/src/properties"
"github.com/jandedobbeleer/oh-my-posh/src/runtime"
)
type AzFunc struct { type AzFunc struct {
language language
} }
@ -13,21 +8,16 @@ func (az *AzFunc) Template() string {
return languageTemplate return languageTemplate
} }
func (az *AzFunc) Init(props properties.Properties, env runtime.Environment) { func (az *AzFunc) Enabled() bool {
az.language = language{ az.extensions = []string{"host.json", "local.settings.json", "function.json"}
env: env, az.commands = []*cmd{
props: props,
extensions: []string{"host.json", "local.settings.json", "function.json"},
commands: []*cmd{
{ {
executable: "func", executable: "func",
args: []string{"--version"}, args: []string{"--version"},
regex: `(?P<version>[0-9.]+)`, regex: `(?P<version>[0-9.]+)`,
}, },
},
}
} }
func (az *AzFunc) Enabled() bool {
return az.language.Enabled() return az.language.Enabled()
} }

View file

@ -140,12 +140,9 @@ func TestAzSegment(t *testing.T) {
tc.Source = FirstMatch tc.Source = FirstMatch
} }
az := &Az{ az := &Az{}
env: env, az.Init(properties.Map{}, env)
props: properties.Map{
Source: tc.Source,
},
}
assert.Equal(t, tc.ExpectedEnabled, az.Enabled(), tc.Case) assert.Equal(t, tc.ExpectedEnabled, az.Enabled(), tc.Case)
assert.Equal(t, tc.ExpectedString, renderTemplate(env, tc.Template, az), tc.Case) assert.Equal(t, tc.ExpectedString, renderTemplate(env, tc.Template, az), tc.Case)
} }

View file

@ -4,14 +4,10 @@ import (
"encoding/json" "encoding/json"
"path/filepath" "path/filepath"
"strings" "strings"
"github.com/jandedobbeleer/oh-my-posh/src/properties"
"github.com/jandedobbeleer/oh-my-posh/src/runtime"
) )
type Azd struct { type Azd struct {
props properties.Properties base
env runtime.Environment
azdConfig azdConfig
} }
@ -25,11 +21,6 @@ func (t *Azd) Template() string {
return " \uebd8 {{ .DefaultEnvironment }} " return " \uebd8 {{ .DefaultEnvironment }} "
} }
func (t *Azd) Init(props properties.Properties, env runtime.Environment) {
t.props = props
t.env = env
}
func (t *Azd) Enabled() bool { func (t *Azd) Enabled() bool {
var parentFilePath string var parentFilePath string

View file

@ -62,10 +62,8 @@ func TestAzdSegment(t *testing.T) {
env.On("HasParentFilePath", ".azure", false).Return(&runtime.FileInfo{}, errors.New("no such file or directory")) env.On("HasParentFilePath", ".azure", false).Return(&runtime.FileInfo{}, errors.New("no such file or directory"))
} }
azd := Azd{ azd := Azd{}
env: env, azd.Init(properties.Map{}, env)
props: properties.Map{},
}
assert.Equal(t, tc.ExpectedEnabled, azd.Enabled(), tc.Case) assert.Equal(t, tc.ExpectedEnabled, azd.Enabled(), tc.Case)
assert.Equal(t, tc.ExpectedString, renderTemplate(env, tc.Template, azd), tc.Case) assert.Equal(t, tc.ExpectedString, renderTemplate(env, tc.Template, azd), tc.Case)

26
src/segments/base.go Normal file
View file

@ -0,0 +1,26 @@
package segments
import (
"github.com/jandedobbeleer/oh-my-posh/src/properties"
"github.com/jandedobbeleer/oh-my-posh/src/runtime"
)
type base struct {
props properties.Properties
env runtime.Environment
Output string `json:"Text"`
}
func (s *base) Text() string {
return s.Output
}
func (s *base) SetText(text string) {
s.Output = text
}
func (s *base) Init(props properties.Properties, env runtime.Environment) {
s.props = props
s.env = env
}

View file

@ -2,13 +2,11 @@ package segments
import ( import (
"github.com/jandedobbeleer/oh-my-posh/src/properties" "github.com/jandedobbeleer/oh-my-posh/src/properties"
"github.com/jandedobbeleer/oh-my-posh/src/runtime"
"github.com/jandedobbeleer/oh-my-posh/src/runtime/battery" "github.com/jandedobbeleer/oh-my-posh/src/runtime/battery"
) )
type Battery struct { type Battery struct {
props properties.Properties base
env runtime.Environment
*battery.Info *battery.Info
Error string Error string
@ -83,8 +81,3 @@ func (b *Battery) enabledWhileError(err error) bool {
b.State = battery.Full b.State = battery.Full
return true return true
} }
func (b *Battery) Init(props properties.Properties, env runtime.Environment) {
b.props = props
b.env = env
}

View file

@ -2,7 +2,6 @@ package segments
import ( import (
"github.com/jandedobbeleer/oh-my-posh/src/properties" "github.com/jandedobbeleer/oh-my-posh/src/properties"
"github.com/jandedobbeleer/oh-my-posh/src/runtime"
) )
type Bazel struct { type Bazel struct {
@ -15,29 +14,24 @@ const (
Icon properties.Property = "icon" Icon properties.Property = "icon"
) )
func (c *Bazel) Template() string { func (b *Bazel) Template() string {
return " {{ if .Error }}{{ .Icon }} {{ .Error }}{{ else }}{{ url .Icon .URL }} {{ .Full }}{{ end }} " return " {{ if .Error }}{{ .Icon }} {{ .Error }}{{ else }}{{ url .Icon .URL }} {{ .Full }}{{ end }} "
} }
func (c *Bazel) Init(props properties.Properties, env runtime.Environment) { func (b *Bazel) Enabled() bool {
c.language = language{ b.extensions = []string{"*.bazel", "*.bzl", "BUILD", "WORKSPACE", ".bazelrc", ".bazelversion"}
env: env, b.folders = []string{"bazel-bin", "bazel-out", "bazel-testlogs"}
props: props, b.commands = []*cmd{
extensions: []string{"*.bazel", "*.bzl", "BUILD", "WORKSPACE", ".bazelrc", ".bazelversion"},
folders: []string{"bazel-bin", "bazel-out", "bazel-testlogs"},
commands: []*cmd{
{ {
executable: "bazel", executable: "bazel",
args: []string{"--version"}, args: []string{"--version"},
regex: `bazel (?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+).(?P<patch>[0-9]+)))`, regex: `bazel (?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+).(?P<patch>[0-9]+)))`,
}, },
}, }
// Use the correct URL for Bazel >5.4.1, since they do not have the docs subdomain. // Use the correct URL for Bazel >5.4.1, since they do not have the docs subdomain.
versionURLTemplate: "https://{{ if lt .Major 6 }}docs.{{ end }}bazel.build/versions/{{ .Major }}.{{ .Minor }}.{{ .Patch }}", b.versionURLTemplate = "https://{{ if lt .Major 6 }}docs.{{ end }}bazel.build/versions/{{ .Major }}.{{ .Minor }}.{{ .Patch }}"
}
c.Icon = props.GetString(Icon, "\ue63a")
}
func (c *Bazel) Enabled() bool { b.Icon = b.props.GetString(Icon, "\ue63a")
return c.language.Enabled()
return b.language.Enabled()
} }

View file

@ -11,13 +11,12 @@ import (
"time" "time"
"github.com/jandedobbeleer/oh-my-posh/src/properties" "github.com/jandedobbeleer/oh-my-posh/src/properties"
"github.com/jandedobbeleer/oh-my-posh/src/runtime"
) )
// segment struct, makes templating easier // segment struct, makes templating easier
type Brewfather struct { type Brewfather struct {
props properties.Properties base
env runtime.Environment
DaysBottledOrFermented *uint DaysBottledOrFermented *uint
TemperatureTrendIcon string TemperatureTrendIcon string
StatusIcon string StatusIcon string
@ -276,8 +275,3 @@ func (bf *Brewfather) SGToPlato(sg float64) float64 {
// from https://en.wikipedia.org/wiki/Brix#Specific_gravity_2 // from https://en.wikipedia.org/wiki/Brix#Specific_gravity_2
return math.Round(100*((135.997*sg*sg*sg)-(630.272*sg*sg)+(1111.14*sg)-616.868)) / 100 // 2 decimal places return math.Round(100*((135.997*sg*sg*sg)-(630.272*sg*sg)+(1111.14*sg)-616.868)) / 100 // 2 decimal places
} }
func (bf *Brewfather) Init(props properties.Properties, env runtime.Environment) {
bf.props = props
bf.env = env
}

View file

@ -156,20 +156,18 @@ func TestBrewfatherSegment(t *testing.T) {
env.On("HTTPRequest", BFBatchReadingsURL).Return([]byte(tc.BatchReadingsJSONResponse), tc.Error) env.On("HTTPRequest", BFBatchReadingsURL).Return([]byte(tc.BatchReadingsJSONResponse), tc.Error)
env.On("Flags").Return(&runtime.Flags{}) env.On("Flags").Return(&runtime.Flags{})
ns := &Brewfather{ brew := &Brewfather{}
props: props, brew.Init(props, env)
env: env,
}
enabled := ns.Enabled() enabled := brew.Enabled()
assert.Equal(t, tc.ExpectedEnabled, enabled, tc.Case) assert.Equal(t, tc.ExpectedEnabled, enabled, tc.Case)
if !enabled { if !enabled {
continue continue
} }
if tc.Template == "" { if tc.Template == "" {
tc.Template = ns.Template() tc.Template = brew.Template()
} }
assert.Equal(t, tc.ExpectedString, renderTemplate(env, tc.Template, ns), tc.Case) assert.Equal(t, tc.ExpectedString, renderTemplate(env, tc.Template, brew), tc.Case)
} }
} }

View file

@ -1,10 +1,5 @@
package segments package segments
import (
"github.com/jandedobbeleer/oh-my-posh/src/properties"
"github.com/jandedobbeleer/oh-my-posh/src/runtime"
)
type Buf struct { type Buf struct {
language language
} }
@ -13,22 +8,16 @@ func (b *Buf) Template() string {
return languageTemplate return languageTemplate
} }
func (b *Buf) Init(props properties.Properties, env runtime.Environment) { func (b *Buf) Enabled() bool {
b.language = language{ b.extensions = []string{"buf.yaml", "buf.gen.yaml", "buf.work.yaml"}
env: env, b.commands = []*cmd{
props: props,
extensions: []string{"buf.yaml", "buf.gen.yaml", "buf.work.yaml"},
commands: []*cmd{
{ {
executable: "buf", executable: "buf",
args: []string{"--version"}, args: []string{"--version"},
regex: `(?:(?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+).(?P<patch>[0-9]+))))`, regex: `(?:(?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+).(?P<patch>[0-9]+))))`,
}, },
},
versionURLTemplate: "https://github.com/bufbuild/buf/releases/tag/v{{.Full}}",
}
} }
b.versionURLTemplate = "https://github.com/bufbuild/buf/releases/tag/v{{.Full}}"
func (b *Buf) Enabled() bool {
return b.language.Enabled() return b.language.Enabled()
} }

View file

@ -1,10 +1,5 @@
package segments package segments
import (
"github.com/jandedobbeleer/oh-my-posh/src/properties"
"github.com/jandedobbeleer/oh-my-posh/src/runtime"
)
type Bun struct { type Bun struct {
language language
} }
@ -13,22 +8,16 @@ func (b *Bun) Template() string {
return languageTemplate return languageTemplate
} }
func (b *Bun) Init(props properties.Properties, env runtime.Environment) { func (b *Bun) Enabled() bool {
b.language = language{ b.extensions = []string{"bun.lockb"}
env: env, b.commands = []*cmd{
props: props,
extensions: []string{"bun.lockb"},
commands: []*cmd{
{ {
executable: "bun", executable: "bun",
args: []string{"--version"}, args: []string{"--version"},
regex: `(?:(?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+).(?P<patch>[0-9]+))))`, regex: `(?:(?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+).(?P<patch>[0-9]+))))`,
}, },
},
versionURLTemplate: "https://github.com/oven-sh/bun/releases/tag/bun-v{{.Full}}",
}
} }
b.versionURLTemplate = "https://github.com/oven-sh/bun/releases/tag/bun-v{{.Full}}"
func (b *Bun) Enabled() bool {
return b.language.Enabled() return b.language.Enabled()
} }

View file

@ -5,12 +5,10 @@ import (
"fmt" "fmt"
"github.com/jandedobbeleer/oh-my-posh/src/properties" "github.com/jandedobbeleer/oh-my-posh/src/properties"
"github.com/jandedobbeleer/oh-my-posh/src/runtime"
) )
type CarbonIntensity struct { type CarbonIntensity struct {
props properties.Properties base
env runtime.Environment
TrendIcon string TrendIcon string
@ -126,8 +124,3 @@ func (d *CarbonIntensity) setStatus() error {
return nil return nil
} }
func (d *CarbonIntensity) Init(props properties.Properties, env runtime.Environment) {
d.props = props
d.env = env
}

View file

@ -229,10 +229,8 @@ func TestCarbonIntensitySegmentSingle(t *testing.T) {
env.On("Error", testify_.Anything) env.On("Error", testify_.Anything)
env.On("Flags").Return(&runtime.Flags{}) env.On("Flags").Return(&runtime.Flags{})
d := &CarbonIntensity{ d := &CarbonIntensity{}
props: props, d.Init(props, env)
env: env,
}
enabled := d.Enabled() enabled := d.Enabled()
assert.Equal(t, tc.ExpectedEnabled, enabled, tc.Case) assert.Equal(t, tc.ExpectedEnabled, enabled, tc.Case)

View file

@ -2,9 +2,6 @@ package segments
import ( import (
"encoding/json" "encoding/json"
"github.com/jandedobbeleer/oh-my-posh/src/properties"
"github.com/jandedobbeleer/oh-my-posh/src/runtime"
) )
type Cds struct { type Cds struct {
@ -16,25 +13,20 @@ func (c *Cds) Template() string {
return languageTemplate return languageTemplate
} }
func (c *Cds) Init(props properties.Properties, env runtime.Environment) { func (c *Cds) Enabled() bool {
c.language = language{ c.extensions = []string{".cdsrc.json", ".cdsrc-private.json", "*.cds"}
env: env, c.commands = []*cmd{
props: props,
extensions: []string{".cdsrc.json", ".cdsrc-private.json", "*.cds"},
commands: []*cmd{
{ {
executable: "cds", executable: "cds",
args: []string{"--version"}, args: []string{"--version"},
regex: `@sap/cds: (?:(?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+).(?P<patch>[0-9]+))))`, regex: `@sap/cds: (?:(?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+).(?P<patch>[0-9]+))))`,
}, },
},
loadContext: c.loadContext,
inContext: c.inContext,
displayMode: props.GetString(DisplayMode, DisplayModeContext),
}
} }
//TODO: is this necessary?
c.language.loadContext = c.loadContext
c.language.inContext = c.inContext
c.displayMode = c.props.GetString(DisplayMode, DisplayModeContext)
func (c *Cds) Enabled() bool {
return c.language.Enabled() return c.language.Enabled()
} }

View file

@ -1,10 +1,5 @@
package segments package segments
import (
"github.com/jandedobbeleer/oh-my-posh/src/properties"
"github.com/jandedobbeleer/oh-my-posh/src/runtime"
)
type Cf struct { type Cf struct {
language language
} }
@ -13,23 +8,17 @@ func (c *Cf) Template() string {
return languageTemplate return languageTemplate
} }
func (c *Cf) Init(props properties.Properties, env runtime.Environment) { func (c *Cf) Enabled() bool {
c.language = language{ c.extensions = []string{"manifest.yml", "mta.yaml"}
env: env, c.commands = []*cmd{
props: props,
extensions: []string{"manifest.yml", "mta.yaml"},
commands: []*cmd{
{ {
executable: "cf", executable: "cf",
args: []string{"version"}, args: []string{"version"},
regex: `(?:(?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+).(?P<patch>[0-9]+))))`, regex: `(?:(?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+).(?P<patch>[0-9]+))))`,
}, },
},
displayMode: props.GetString(DisplayMode, DisplayModeFiles),
versionURLTemplate: "https://github.com/cloudfoundry/cli/releases/tag/v{{ .Full }}",
}
} }
c.displayMode = c.props.GetString(DisplayMode, DisplayModeFiles)
c.versionURLTemplate = "https://github.com/cloudfoundry/cli/releases/tag/v{{ .Full }}"
func (c *Cf) Enabled() bool {
return c.language.Enabled() return c.language.Enabled()
} }

View file

@ -5,12 +5,10 @@ import (
"strings" "strings"
"github.com/jandedobbeleer/oh-my-posh/src/properties" "github.com/jandedobbeleer/oh-my-posh/src/properties"
"github.com/jandedobbeleer/oh-my-posh/src/runtime"
) )
type CfTarget struct { type CfTarget struct {
props properties.Properties base
env runtime.Environment
CfTargetDetails CfTargetDetails
} }
@ -26,11 +24,6 @@ func (c *CfTarget) Template() string {
return "{{if .Org }}{{ .Org }}{{ end }}{{if .Space }}/{{ .Space }}{{ end }}" return "{{if .Org }}{{ .Org }}{{ end }}{{if .Space }}/{{ .Space }}{{ end }}"
} }
func (c *CfTarget) Init(props properties.Properties, env runtime.Environment) {
c.props = props
c.env = env
}
func (c *CfTarget) Enabled() bool { func (c *CfTarget) Enabled() bool {
if !c.env.HasCommand("cf") { if !c.env.HasCommand("cf") {
return false return false

View file

@ -1,10 +1,5 @@
package segments package segments
import (
"github.com/jandedobbeleer/oh-my-posh/src/properties"
"github.com/jandedobbeleer/oh-my-posh/src/runtime"
)
type Cmake struct { type Cmake struct {
language language
} }
@ -13,22 +8,16 @@ func (c *Cmake) Template() string {
return languageTemplate return languageTemplate
} }
func (c *Cmake) Init(props properties.Properties, env runtime.Environment) { func (c *Cmake) Enabled() bool {
c.language = language{ c.extensions = []string{"*.cmake", "CMakeLists.txt"}
env: env, c.commands = []*cmd{
props: props,
extensions: []string{"*.cmake", "CMakeLists.txt"},
commands: []*cmd{
{ {
executable: "cmake", executable: "cmake",
args: []string{"--version"}, args: []string{"--version"},
regex: `cmake version (?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+).(?P<patch>[0-9]+)))`, regex: `cmake version (?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+).(?P<patch>[0-9]+)))`,
}, },
},
versionURLTemplate: "https://cmake.org/cmake/help/v{{ .Major }}.{{ .Minor }}",
}
} }
c.versionURLTemplate = "https://cmake.org/cmake/help/v{{ .Major }}.{{ .Minor }}"
func (c *Cmake) Enabled() bool {
return c.language.Enabled() return c.language.Enabled()
} }

View file

@ -4,12 +4,10 @@ import (
"strings" "strings"
"github.com/jandedobbeleer/oh-my-posh/src/properties" "github.com/jandedobbeleer/oh-my-posh/src/properties"
"github.com/jandedobbeleer/oh-my-posh/src/runtime"
) )
type Cmd struct { type Cmd struct {
props properties.Properties base
env runtime.Environment
Output string Output string
} }
@ -85,8 +83,3 @@ func (c *Cmd) runScript(shell, script string) bool {
c.Output = c.env.RunShellCommand(shell, script) c.Output = c.env.RunShellCommand(shell, script)
return len(c.Output) != 0 return len(c.Output) != 0
} }
func (c *Cmd) Init(props properties.Properties, env runtime.Environment) {
c.props = props
c.env = env
}

View file

@ -16,10 +16,10 @@ func TestExecuteCommand(t *testing.T) {
props := properties.Map{ props := properties.Map{
Command: "echo hello", Command: "echo hello",
} }
c := &Cmd{
props: props, c := &Cmd{}
env: env, c.Init(props, env)
}
enabled := c.Enabled() enabled := c.Enabled()
assert.True(t, enabled) assert.True(t, enabled)
assert.Equal(t, "hello", renderTemplate(env, c.Template(), c)) assert.Equal(t, "hello", renderTemplate(env, c.Template(), c))
@ -34,10 +34,10 @@ func TestExecuteMultipleCommandsOrFirst(t *testing.T) {
props := properties.Map{ props := properties.Map{
Command: "exit 1 || echo hello", Command: "exit 1 || echo hello",
} }
c := &Cmd{
props: props, c := &Cmd{}
env: env, c.Init(props, env)
}
enabled := c.Enabled() enabled := c.Enabled()
assert.True(t, enabled) assert.True(t, enabled)
assert.Equal(t, "hello", renderTemplate(env, c.Template(), c)) assert.Equal(t, "hello", renderTemplate(env, c.Template(), c))
@ -51,10 +51,10 @@ func TestExecuteMultipleCommandsOrSecond(t *testing.T) {
props := properties.Map{ props := properties.Map{
Command: "echo hello || echo world", Command: "echo hello || echo world",
} }
c := &Cmd{
props: props, c := &Cmd{}
env: env, c.Init(props, env)
}
enabled := c.Enabled() enabled := c.Enabled()
assert.True(t, enabled) assert.True(t, enabled)
assert.Equal(t, "hello", renderTemplate(env, c.Template(), c)) assert.Equal(t, "hello", renderTemplate(env, c.Template(), c))
@ -68,10 +68,10 @@ func TestExecuteMultipleCommandsAnd(t *testing.T) {
props := properties.Map{ props := properties.Map{
Command: "echo hello && echo world", Command: "echo hello && echo world",
} }
c := &Cmd{
props: props, c := &Cmd{}
env: env, c.Init(props, env)
}
enabled := c.Enabled() enabled := c.Enabled()
assert.True(t, enabled) assert.True(t, enabled)
assert.Equal(t, "helloworld", renderTemplate(env, c.Template(), c)) assert.Equal(t, "helloworld", renderTemplate(env, c.Template(), c))
@ -84,10 +84,10 @@ func TestExecuteSingleCommandEmpty(t *testing.T) {
props := properties.Map{ props := properties.Map{
Command: "", Command: "",
} }
c := &Cmd{
props: props, c := &Cmd{}
env: env, c.Init(props, env)
}
enabled := c.Enabled() enabled := c.Enabled()
assert.False(t, enabled) assert.False(t, enabled)
} }
@ -97,10 +97,10 @@ func TestExecuteSingleCommandNoCommandProperty(t *testing.T) {
env.On("HasCommand", "bash").Return(true) env.On("HasCommand", "bash").Return(true)
env.On("RunShellCommand", "bash", "").Return("") env.On("RunShellCommand", "bash", "").Return("")
var props properties.Map var props properties.Map
c := &Cmd{
props: props, c := &Cmd{}
env: env, c.Init(props, env)
}
enabled := c.Enabled() enabled := c.Enabled()
assert.False(t, enabled) assert.False(t, enabled)
} }
@ -112,10 +112,10 @@ func TestExecuteMultipleCommandsAndDisabled(t *testing.T) {
props := properties.Map{ props := properties.Map{
Command: "echo && echo", Command: "echo && echo",
} }
c := &Cmd{
props: props, c := &Cmd{}
env: env, c.Init(props, env)
}
enabled := c.Enabled() enabled := c.Enabled()
assert.False(t, enabled) assert.False(t, enabled)
} }
@ -128,10 +128,10 @@ func TestExecuteMultipleCommandsOrDisabled(t *testing.T) {
props := properties.Map{ props := properties.Map{
Command: "echo|| echo", Command: "echo|| echo",
} }
c := &Cmd{
props: props, c := &Cmd{}
env: env, c.Init(props, env)
}
enabled := c.Enabled() enabled := c.Enabled()
assert.False(t, enabled) assert.False(t, enabled)
} }
@ -144,10 +144,10 @@ func TestExecuteNonInterpretedCommand(t *testing.T) {
Command: "echo hello && echo world", Command: "echo hello && echo world",
Interpret: false, Interpret: false,
} }
c := &Cmd{
props: props, c := &Cmd{}
env: env, c.Init(props, env)
}
enabled := c.Enabled() enabled := c.Enabled()
assert.True(t, enabled) assert.True(t, enabled)
assert.Equal(t, "hello world", renderTemplate(env, c.Template(), c)) assert.Equal(t, "hello world", renderTemplate(env, c.Template(), c))
@ -180,10 +180,10 @@ func TestExecuteScript(t *testing.T) {
props := properties.Map{ props := properties.Map{
Script: script, Script: script,
} }
c := &Cmd{
props: props, c := &Cmd{}
env: env, c.Init(props, env)
}
enabled := c.Enabled() enabled := c.Enabled()
assert.Equal(t, tc.ExpectedEnabled, enabled, tc.Case) assert.Equal(t, tc.ExpectedEnabled, enabled, tc.Case)
if tc.ExpectedEnabled { if tc.ExpectedEnabled {

View file

@ -8,8 +8,7 @@ import (
) )
type Connection struct { type Connection struct {
props properties.Properties base
env runtime.Environment
runtime.Connection runtime.Connection
} }
@ -35,8 +34,3 @@ func (c *Connection) Enabled() bool {
} }
return false return false
} }
func (c *Connection) Init(props properties.Properties, env runtime.Environment) {
c.props = props
c.env = env
}

View file

@ -92,12 +92,14 @@ func TestConnection(t *testing.T) {
for _, con := range tc.Connections { for _, con := range tc.Connections {
env.On("Connection", con.Connection.Type).Return(con.Connection, con.Error) env.On("Connection", con.Connection.Type).Return(con.Connection, con.Error)
} }
c := &Connection{
env: env, props := &properties.Map{
props: &properties.Map{
Type: tc.ConnectionType, Type: tc.ConnectionType,
},
} }
c := &Connection{}
c.Init(props, env)
assert.Equal(t, tc.ExpectedEnabled, c.Enabled(), fmt.Sprintf("Failed in case: %s", tc.Case)) assert.Equal(t, tc.ExpectedEnabled, c.Enabled(), fmt.Sprintf("Failed in case: %s", tc.Case))
if tc.ExpectedEnabled { if tc.ExpectedEnabled {
assert.Equal(t, tc.ExpectedString, renderTemplate(env, c.Template(), c), fmt.Sprintf("Failed in case: %s", tc.Case)) assert.Equal(t, tc.ExpectedString, renderTemplate(env, c.Template(), c), fmt.Sprintf("Failed in case: %s", tc.Case))

View file

@ -1,10 +1,5 @@
package segments package segments
import (
"github.com/jandedobbeleer/oh-my-posh/src/properties"
"github.com/jandedobbeleer/oh-my-posh/src/runtime"
)
type Crystal struct { type Crystal struct {
language language
} }
@ -13,22 +8,16 @@ func (c *Crystal) Template() string {
return languageTemplate return languageTemplate
} }
func (c *Crystal) Init(props properties.Properties, env runtime.Environment) { func (c *Crystal) Enabled() bool {
c.language = language{ c.extensions = []string{"*.cr", "shard.yml"}
env: env, c.commands = []*cmd{
props: props,
extensions: []string{"*.cr", "shard.yml"},
commands: []*cmd{
{ {
executable: "crystal", executable: "crystal",
args: []string{"--version"}, args: []string{"--version"},
regex: `Crystal (?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+).(?P<patch>[0-9]+)))`, regex: `Crystal (?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+).(?P<patch>[0-9]+)))`,
}, },
},
versionURLTemplate: "https://github.com/crystal-lang/crystal/releases/tag/{{ .Full }}",
}
} }
c.versionURLTemplate = "https://github.com/crystal-lang/crystal/releases/tag/{{ .Full }}"
func (c *Crystal) Enabled() bool {
return c.language.Enabled() return c.language.Enabled()
} }

View file

@ -1,10 +1,5 @@
package segments package segments
import (
"github.com/jandedobbeleer/oh-my-posh/src/properties"
"github.com/jandedobbeleer/oh-my-posh/src/runtime"
)
var ( var (
dartExtensions = []string{"*.dart", "pubspec.yaml", "pubspec.yml", "pubspec.lock"} dartExtensions = []string{"*.dart", "pubspec.yaml", "pubspec.yml", "pubspec.lock"}
dartFolders = []string{".dart_tool"} dartFolders = []string{".dart_tool"}
@ -18,23 +13,17 @@ func (d *Dart) Template() string {
return languageTemplate return languageTemplate
} }
func (d *Dart) Init(props properties.Properties, env runtime.Environment) { func (d *Dart) Enabled() bool {
d.language = language{ d.extensions = dartExtensions
env: env, d.folders = dartFolders
props: props, d.commands = []*cmd{
extensions: dartExtensions,
folders: dartFolders,
commands: []*cmd{
{ {
executable: "dart", executable: "dart",
args: []string{"--version"}, args: []string{"--version"},
regex: `Dart SDK version: (?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+).(?P<patch>[0-9]+)))`, regex: `Dart SDK version: (?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+).(?P<patch>[0-9]+)))`,
}, },
},
versionURLTemplate: "https://dart.dev/guides/language/evolution#dart-{{ .Major }}{{ .Minor }}",
}
} }
d.versionURLTemplate = "https://dart.dev/guides/language/evolution#dart-{{ .Major }}{{ .Minor }}"
func (d *Dart) Enabled() bool {
return d.language.Enabled() return d.language.Enabled()
} }

View file

@ -1,10 +1,5 @@
package segments package segments
import (
"github.com/jandedobbeleer/oh-my-posh/src/properties"
"github.com/jandedobbeleer/oh-my-posh/src/runtime"
)
type Deno struct { type Deno struct {
language language
} }
@ -13,22 +8,16 @@ func (d *Deno) Template() string {
return languageTemplate return languageTemplate
} }
func (d *Deno) Init(props properties.Properties, env runtime.Environment) { func (d *Deno) Enabled() bool {
d.language = language{ d.extensions = []string{"*.js", "*.ts", "deno.json"}
env: env, d.commands = []*cmd{
props: props,
extensions: []string{"*.js", "*.ts", "deno.json"},
commands: []*cmd{
{ {
executable: "deno", executable: "deno",
args: []string{"--version"}, args: []string{"--version"},
regex: `(?:(?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+).(?P<patch>[0-9]+))))`, regex: `(?:(?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+).(?P<patch>[0-9]+))))`,
}, },
},
versionURLTemplate: "https://github.com/denoland/deno/releases/tag/v{{.Full}}",
}
} }
d.versionURLTemplate = "https://github.com/denoland/deno/releases/tag/v{{.Full}}"
func (d *Deno) Enabled() bool {
return d.language.Enabled() return d.language.Enabled()
} }

View file

@ -3,9 +3,6 @@ package segments
import ( import (
"encoding/json" "encoding/json"
"path/filepath" "path/filepath"
"github.com/jandedobbeleer/oh-my-posh/src/properties"
"github.com/jandedobbeleer/oh-my-posh/src/runtime"
) )
type DockerConfig struct { type DockerConfig struct {
@ -13,8 +10,7 @@ type DockerConfig struct {
} }
type Docker struct { type Docker struct {
props properties.Properties base
env runtime.Environment
Context string Context string
} }
@ -23,11 +19,6 @@ func (d *Docker) Template() string {
return " \uf308 {{ .Context }} " return " \uf308 {{ .Context }} "
} }
func (d *Docker) Init(props properties.Properties, env runtime.Environment) {
d.props = props
d.env = env
}
func (d *Docker) envVars() []string { func (d *Docker) envVars() []string {
return []string{"DOCKER_MACHINE_NAME", "DOCKER_HOST", "DOCKER_CONTEXT"} return []string{"DOCKER_MACHINE_NAME", "DOCKER_HOST", "DOCKER_CONTEXT"}
} }

View file

@ -2,8 +2,6 @@ package segments
import ( import (
"github.com/jandedobbeleer/oh-my-posh/src/constants" "github.com/jandedobbeleer/oh-my-posh/src/constants"
"github.com/jandedobbeleer/oh-my-posh/src/properties"
"github.com/jandedobbeleer/oh-my-posh/src/runtime"
) )
type Dotnet struct { type Dotnet struct {
@ -16,24 +14,30 @@ func (d *Dotnet) Template() string {
return " {{ if .Unsupported }}\uf071{{ else }}{{ .Full }}{{ end }} " return " {{ if .Unsupported }}\uf071{{ else }}{{ .Full }}{{ end }} "
} }
func (d *Dotnet) Init(props properties.Properties, env runtime.Environment) { func (d *Dotnet) Enabled() bool {
d.language = language{ d.extensions = []string{
env: env, "*.cs",
props: props, "*.csx",
extensions: []string{"*.cs", "*.csx", "*.vb", "*.sln", "*.slnf", "*.csproj", "*.vbproj", "*.fs", "*.fsx", "*.fsproj", "global.json"}, "*.vb",
commands: []*cmd{ "*.sln",
"*.slnf",
"*.csproj",
"*.vbproj",
"*.fs",
"*.fsx",
"*.fsproj",
"global.json",
}
d.commands = []*cmd{
{ {
executable: "dotnet", executable: "dotnet",
args: []string{"--version"}, args: []string{"--version"},
regex: `(?P<version>((?P<major>0|[1-9]\d*)\.(?P<minor>0|[1-9]\d*)\.(?P<patch>0|[1-9]\d*)` + regex: `(?P<version>((?P<major>0|[1-9]\d*)\.(?P<minor>0|[1-9]\d*)\.(?P<patch>0|[1-9]\d*)` +
`(?:-(?P<prerelease>(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+(?P<buildmetadata>[0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?))`, `(?:-(?P<prerelease>(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+(?P<buildmetadata>[0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?))`,
}, },
},
versionURLTemplate: "https://github.com/dotnet/core/blob/master/release-notes/{{ .Major }}.{{ .Minor }}/{{ .Major }}.{{ .Minor }}.{{ substr 0 1 .Patch }}/{{ .Major }}.{{ .Minor }}.{{ substr 0 1 .Patch }}.md", //nolint: lll
}
} }
d.versionURLTemplate = "https://github.com/dotnet/core/blob/master/release-notes/{{ .Major }}.{{ .Minor }}/{{ .Major }}.{{ .Minor }}.{{ substr 0 1 .Patch }}/{{ .Major }}.{{ .Minor }}.{{ substr 0 1 .Patch }}.md" //nolint: lll
func (d *Dotnet) Enabled() bool {
enabled := d.language.Enabled() enabled := d.language.Enabled()
if !enabled { if !enabled {
return false return false

View file

@ -1,10 +1,5 @@
package segments package segments
import (
"github.com/jandedobbeleer/oh-my-posh/src/properties"
"github.com/jandedobbeleer/oh-my-posh/src/runtime"
)
type Elixir struct { type Elixir struct {
language language
} }
@ -13,12 +8,9 @@ func (e *Elixir) Template() string {
return languageTemplate return languageTemplate
} }
func (e *Elixir) Init(props properties.Properties, env runtime.Environment) { func (e *Elixir) Enabled() bool {
e.language = language{ e.extensions = []string{"*.ex", "*.exs"}
env: env, e.commands = []*cmd{
props: props,
extensions: []string{"*.ex", "*.exs"},
commands: []*cmd{
{ {
executable: "asdf", executable: "asdf",
args: []string{"current", "elixir"}, args: []string{"current", "elixir"},
@ -29,11 +21,8 @@ func (e *Elixir) Init(props properties.Properties, env runtime.Environment) {
args: []string{"--version"}, args: []string{"--version"},
regex: `Elixir (?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+).(?P<patch>[0-9]+)))`, regex: `Elixir (?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+).(?P<patch>[0-9]+)))`,
}, },
},
versionURLTemplate: "https://github.com/elixir-lang/elixir/releases/tag/v{{ .Full }}",
}
} }
e.versionURLTemplate = "https://github.com/elixir-lang/elixir/releases/tag/v{{ .Full }}"
func (e *Elixir) Enabled() bool {
return e.language.Enabled() return e.language.Enabled()
} }

View file

@ -5,15 +5,13 @@ import (
"strconv" "strconv"
"github.com/jandedobbeleer/oh-my-posh/src/properties" "github.com/jandedobbeleer/oh-my-posh/src/properties"
"github.com/jandedobbeleer/oh-my-posh/src/runtime"
lang "golang.org/x/text/language" lang "golang.org/x/text/language"
"golang.org/x/text/message" "golang.org/x/text/message"
) )
type Executiontime struct { type Executiontime struct {
props properties.Properties base
env runtime.Environment
FormattedMs string FormattedMs string
Ms int64 Ms int64
@ -70,11 +68,6 @@ func (t *Executiontime) Template() string {
return " {{ .FormattedMs }} " return " {{ .FormattedMs }} "
} }
func (t *Executiontime) Init(props properties.Properties, env runtime.Environment) {
t.props = props
t.env = env
}
func (t *Executiontime) formatDuration(style DurationStyle) string { func (t *Executiontime) formatDuration(style DurationStyle) string {
switch style { switch style {
case Austin: case Austin:

View file

@ -14,20 +14,20 @@ import (
func TestExecutionTimeWriterDefaultThresholdEnabled(t *testing.T) { func TestExecutionTimeWriterDefaultThresholdEnabled(t *testing.T) {
env := new(mock.Environment) env := new(mock.Environment)
env.On("ExecutionTime").Return(1337) env.On("ExecutionTime").Return(1337)
executionTime := &Executiontime{
env: env, executionTime := &Executiontime{}
props: properties.Map{}, executionTime.Init(properties.Map{}, env)
}
assert.True(t, executionTime.Enabled()) assert.True(t, executionTime.Enabled())
} }
func TestExecutionTimeWriterDefaultThresholdDisabled(t *testing.T) { func TestExecutionTimeWriterDefaultThresholdDisabled(t *testing.T) {
env := new(mock.Environment) env := new(mock.Environment)
env.On("ExecutionTime").Return(1) env.On("ExecutionTime").Return(1)
executionTime := &Executiontime{
env: env, executionTime := &Executiontime{}
props: properties.Map{}, executionTime.Init(properties.Map{}, env)
}
assert.False(t, executionTime.Enabled()) assert.False(t, executionTime.Enabled())
} }
@ -37,10 +37,10 @@ func TestExecutionTimeWriterCustomThresholdEnabled(t *testing.T) {
props := properties.Map{ props := properties.Map{
ThresholdProperty: float64(10), ThresholdProperty: float64(10),
} }
executionTime := &Executiontime{
env: env, executionTime := &Executiontime{}
props: props, executionTime.Init(props, env)
}
assert.True(t, executionTime.Enabled()) assert.True(t, executionTime.Enabled())
} }
@ -50,10 +50,10 @@ func TestExecutionTimeWriterCustomThresholdDisabled(t *testing.T) {
props := properties.Map{ props := properties.Map{
ThresholdProperty: float64(100), ThresholdProperty: float64(100),
} }
executionTime := &Executiontime{
env: env, executionTime := &Executiontime{}
props: props, executionTime.Init(props, env)
}
assert.False(t, executionTime.Enabled()) assert.False(t, executionTime.Enabled())
} }
@ -62,10 +62,10 @@ func TestExecutionTimeWriterDuration(t *testing.T) {
expected := "1.337s" expected := "1.337s"
env := new(mock.Environment) env := new(mock.Environment)
env.On("ExecutionTime").Return(input) env.On("ExecutionTime").Return(input)
executionTime := &Executiontime{
env: env, executionTime := &Executiontime{}
props: properties.Map{}, executionTime.Init(properties.Map{}, env)
}
executionTime.Enabled() executionTime.Enabled()
assert.Equal(t, expected, executionTime.FormattedMs) assert.Equal(t, expected, executionTime.FormattedMs)
} }
@ -75,10 +75,10 @@ func TestExecutionTimeWriterDuration2(t *testing.T) {
expected := "3h 42m 51.337s" expected := "3h 42m 51.337s"
env := new(mock.Environment) env := new(mock.Environment)
env.On("ExecutionTime").Return(input) env.On("ExecutionTime").Return(input)
executionTime := &Executiontime{
env: env, executionTime := &Executiontime{}
props: properties.Map{}, executionTime.Init(properties.Map{}, env)
}
executionTime.Enabled() executionTime.Enabled()
assert.Equal(t, expected, executionTime.FormattedMs) assert.Equal(t, expected, executionTime.FormattedMs)
} }

View file

@ -5,9 +5,6 @@ import (
"errors" "errors"
"path/filepath" "path/filepath"
"strings" "strings"
"github.com/jandedobbeleer/oh-my-posh/src/properties"
"github.com/jandedobbeleer/oh-my-posh/src/runtime"
) )
const ( const (
@ -15,8 +12,7 @@ const (
) )
type Firebase struct { type Firebase struct {
props properties.Properties base
env runtime.Environment
Project string Project string
} }
@ -29,11 +25,6 @@ func (f *Firebase) Template() string {
return " {{ .Project}} " return " {{ .Project}} "
} }
func (f *Firebase) Init(props properties.Properties, env runtime.Environment) {
f.props = props
f.env = env
}
func (f *Firebase) Enabled() bool { func (f *Firebase) Enabled() bool {
cfgDir := filepath.Join(f.env.Home(), ".config", "configstore") cfgDir := filepath.Join(f.env.Home(), ".config", "configstore")
configFile, err := f.getActiveConfig(cfgDir) configFile, err := f.getActiveConfig(cfgDir)

View file

@ -4,6 +4,7 @@ import (
"path/filepath" "path/filepath"
"testing" "testing"
"github.com/jandedobbeleer/oh-my-posh/src/properties"
"github.com/jandedobbeleer/oh-my-posh/src/runtime/mock" "github.com/jandedobbeleer/oh-my-posh/src/runtime/mock"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
testify_ "github.com/stretchr/testify/mock" testify_ "github.com/stretchr/testify/mock"
@ -59,10 +60,12 @@ func TestFirebaseSegment(t *testing.T) {
fcPath := filepath.Join("home", ".config", "configstore", "firebase-tools.json") fcPath := filepath.Join("home", ".config", "configstore", "firebase-tools.json")
env.On("FileContent", fcPath).Return(tc.ActiveConfig) env.On("FileContent", fcPath).Return(tc.ActiveConfig)
env.On("Error", testify_.Anything).Return() env.On("Error", testify_.Anything).Return()
f := Firebase{
env: env, f := &Firebase{}
} f.Init(properties.Map{}, env)
f.Enabled() f.Enabled()
assert.Equal(t, tc.ExpectedEnabled, f.Enabled()) assert.Equal(t, tc.ExpectedEnabled, f.Enabled())
if tc.ExpectedEnabled { if tc.ExpectedEnabled {
assert.Equal(t, tc.ExpectedString, renderTemplate(env, f.Template(), f), tc.Case) assert.Equal(t, tc.ExpectedString, renderTemplate(env, f.Template(), f), tc.Case)
@ -102,9 +105,10 @@ func TestGetFirebaseActiveConfig(t *testing.T) {
contentPath := filepath.Join(configPath, "firebase-tools.json") contentPath := filepath.Join(configPath, "firebase-tools.json")
env.On("FileContent", contentPath).Return(tc.ActiveConfig) env.On("FileContent", contentPath).Return(tc.ActiveConfig)
env.On("Error", testify_.Anything).Return() env.On("Error", testify_.Anything).Return()
f := Firebase{
env: env, f := &Firebase{}
} f.Init(properties.Map{}, env)
got, err := f.getActiveConfig(configPath) got, err := f.getActiveConfig(configPath)
assert.Equal(t, tc.ExpectedString, got, tc.Case) assert.Equal(t, tc.ExpectedString, got, tc.Case)
if len(tc.ExpectedError) > 0 { if len(tc.ExpectedError) > 0 {

View file

@ -1,10 +1,5 @@
package segments package segments
import (
"github.com/jandedobbeleer/oh-my-posh/src/properties"
"github.com/jandedobbeleer/oh-my-posh/src/runtime"
)
type Flutter struct { type Flutter struct {
language language
} }
@ -13,23 +8,17 @@ func (f *Flutter) Template() string {
return languageTemplate return languageTemplate
} }
func (f *Flutter) Init(props properties.Properties, env runtime.Environment) { func (f *Flutter) Enabled() bool {
f.language = language{ f.extensions = dartExtensions
env: env, f.folders = dartFolders
props: props, f.commands = []*cmd{
extensions: dartExtensions,
folders: dartFolders,
commands: []*cmd{
{ {
executable: "flutter", executable: "flutter",
args: []string{"--version"}, args: []string{"--version"},
regex: `Flutter (?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+).(?P<patch>[0-9]+)))`, regex: `Flutter (?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+).(?P<patch>[0-9]+)))`,
}, },
},
versionURLTemplate: "https://github.com/flutter/flutter/releases/tag/{{ .Major }}.{{ .Minor }}.{{ .Patch }}",
}
} }
f.versionURLTemplate = "https://github.com/flutter/flutter/releases/tag/{{ .Major }}.{{ .Minor }}.{{ .Patch }}"
func (f *Flutter) Enabled() bool {
return f.language.Enabled() return f.language.Enabled()
} }

View file

@ -67,13 +67,12 @@ func TestFossilStatus(t *testing.T) {
env.On("InWSLSharedDrive").Return(false) env.On("InWSLSharedDrive").Return(false)
env.On("HasCommand", FOSSILCOMMAND).Return(tc.HasCommand) env.On("HasCommand", FOSSILCOMMAND).Return(tc.HasCommand)
env.On("RunCommand", FOSSILCOMMAND, []string{"status"}).Return(strings.ReplaceAll(tc.Output, "\t", ""), tc.OutputError) env.On("RunCommand", FOSSILCOMMAND, []string{"status"}).Return(strings.ReplaceAll(tc.Output, "\t", ""), tc.OutputError)
f := &Fossil{
scm: scm{ f := &Fossil{}
env: env, f.Init(properties.Map{}, env)
props: properties.Map{},
},
}
got := f.Enabled() got := f.Enabled()
assert.Equal(t, !tc.ExpectedDisabled, got, tc.Case) assert.Equal(t, !tc.ExpectedDisabled, got, tc.Case)
if tc.ExpectedDisabled { if tc.ExpectedDisabled {
continue continue

View file

@ -4,7 +4,6 @@ import (
"errors" "errors"
"path" "path"
"github.com/jandedobbeleer/oh-my-posh/src/properties"
"github.com/jandedobbeleer/oh-my-posh/src/runtime" "github.com/jandedobbeleer/oh-my-posh/src/runtime"
"gopkg.in/ini.v1" "gopkg.in/ini.v1"
@ -15,8 +14,7 @@ const (
) )
type Gcp struct { type Gcp struct {
props properties.Properties base
env runtime.Environment
Account string Account string
Project string Project string
@ -27,11 +25,6 @@ func (g *Gcp) Template() string {
return " {{ .Project }} " return " {{ .Project }} "
} }
func (g *Gcp) Init(props properties.Properties, env runtime.Environment) {
g.props = props
g.env = env
}
func (g *Gcp) Enabled() bool { func (g *Gcp) Enabled() bool {
cfgDir := g.getConfigDirectory() cfgDir := g.getConfigDirectory()
configFile, err := g.getActiveConfig(cfgDir) configFile, err := g.getActiveConfig(cfgDir)

View file

@ -4,6 +4,7 @@ import (
"path" "path"
"testing" "testing"
"github.com/jandedobbeleer/oh-my-posh/src/properties"
"github.com/jandedobbeleer/oh-my-posh/src/runtime" "github.com/jandedobbeleer/oh-my-posh/src/runtime"
"github.com/jandedobbeleer/oh-my-posh/src/runtime/mock" "github.com/jandedobbeleer/oh-my-posh/src/runtime/mock"
@ -58,9 +59,10 @@ func TestGcpSegment(t *testing.T) {
cfgpath := path.Join("config", "configurations", "config_production") cfgpath := path.Join("config", "configurations", "config_production")
env.On("FileContent", cfgpath).Return(tc.CfgData) env.On("FileContent", cfgpath).Return(tc.CfgData)
env.On("Error", testify_.Anything).Return() env.On("Error", testify_.Anything).Return()
g := &Gcp{
env: env, g := &Gcp{}
} g.Init(properties.Map{}, env)
assert.Equal(t, tc.ExpectedEnabled, g.Enabled(), tc.Case) assert.Equal(t, tc.ExpectedEnabled, g.Enabled(), tc.Case)
if tc.ExpectedEnabled { if tc.ExpectedEnabled {
assert.Equal(t, tc.ExpectedString, renderTemplate(env, "{{.Project}} :: {{.Region}} :: {{.Account}}", g), tc.Case) assert.Equal(t, tc.ExpectedString, renderTemplate(env, "{{.Project}} :: {{.Region}} :: {{.Account}}", g), tc.Case)
@ -101,9 +103,10 @@ func TestGetConfigDirectory(t *testing.T) {
env.On("Getenv", "APPDATA").Return(tc.AppData) env.On("Getenv", "APPDATA").Return(tc.AppData)
env.On("Home").Return(tc.Home) env.On("Home").Return(tc.Home)
env.On("GOOS").Return(tc.GOOS) env.On("GOOS").Return(tc.GOOS)
g := &Gcp{
env: env, g := &Gcp{}
} g.Init(properties.Map{}, env)
assert.Equal(t, tc.Expected, g.getConfigDirectory(), tc.Case) assert.Equal(t, tc.Expected, g.getConfigDirectory(), tc.Case)
} }
} }
@ -129,9 +132,10 @@ func TestGetActiveConfig(t *testing.T) {
for _, tc := range cases { for _, tc := range cases {
env := new(mock.Environment) env := new(mock.Environment)
env.On("FileContent", "active_config").Return(tc.ActiveConfig) env.On("FileContent", "active_config").Return(tc.ActiveConfig)
g := &Gcp{
env: env, g := &Gcp{}
} g.Init(properties.Map{}, env)
got, err := g.getActiveConfig("") got, err := g.getActiveConfig("")
assert.Equal(t, tc.ExpectedString, got, tc.Case) assert.Equal(t, tc.ExpectedString, got, tc.Case)
if len(tc.ExpectedError) > 0 { if len(tc.ExpectedError) > 0 {

View file

@ -29,12 +29,10 @@ func TestEnabledGitNotFound(t *testing.T) {
env.On("HasCommand", "git").Return(false) env.On("HasCommand", "git").Return(false)
env.On("GOOS").Return("") env.On("GOOS").Return("")
env.On("IsWsl").Return(false) env.On("IsWsl").Return(false)
g := &Git{
scm: scm{ g := &Git{}
env: env, g.Init(properties.Map{}, env)
props: properties.Map{},
},
}
assert.False(t, g.Enabled()) assert.False(t, g.Enabled())
} }
@ -56,12 +54,10 @@ func TestEnabledInWorkingDirectory(t *testing.T) {
env.On("Home").Return(poshHome) env.On("Home").Return(poshHome)
env.On("Getenv", poshGitEnv).Return("") env.On("Getenv", poshGitEnv).Return("")
env.On("DirMatchesOneOf", testify_.Anything, testify_.Anything).Return(false) env.On("DirMatchesOneOf", testify_.Anything, testify_.Anything).Return(false)
g := &Git{
scm: scm{ g := &Git{}
env: env, g.Init(properties.Map{}, env)
props: properties.Map{},
},
}
assert.True(t, g.Enabled()) assert.True(t, g.Enabled())
assert.Equal(t, fileInfo.Path, g.workingDir) assert.Equal(t, fileInfo.Path, g.workingDir)
} }
@ -138,12 +134,10 @@ func TestEnabledInWorktree(t *testing.T) {
env.On("HasFilesInDir", tc.WorkingFolder, tc.WorkingFolderAddon).Return(true) env.On("HasFilesInDir", tc.WorkingFolder, tc.WorkingFolderAddon).Return(true)
env.On("HasFilesInDir", tc.WorkingFolder, "HEAD").Return(true) env.On("HasFilesInDir", tc.WorkingFolder, "HEAD").Return(true)
env.On("PathSeparator").Return(string(os.PathSeparator)) env.On("PathSeparator").Return(string(os.PathSeparator))
g := &Git{
scm: scm{ g := &Git{}
env: env, g.Init(properties.Map{}, env)
props: properties.Map{},
},
}
assert.Equal(t, tc.ExpectedEnabled, g.hasWorktree(fileInfo), tc.Case) assert.Equal(t, tc.ExpectedEnabled, g.hasWorktree(fileInfo), tc.Case)
assert.Equal(t, tc.ExpectedWorkingFolder, g.workingDir, tc.Case) assert.Equal(t, tc.ExpectedWorkingFolder, g.workingDir, tc.Case)
assert.Equal(t, tc.ExpectedRealFolder, g.realDir, tc.Case) assert.Equal(t, tc.ExpectedRealFolder, g.realDir, tc.Case)
@ -198,15 +192,15 @@ func TestEnabledInBareRepo(t *testing.T) {
env.On("FileContent", "/home/user/bare.git/HEAD").Return(tc.HEAD) env.On("FileContent", "/home/user/bare.git/HEAD").Return(tc.HEAD)
env.MockGitCommand(pwd, tc.Remote, "remote") env.MockGitCommand(pwd, tc.Remote, "remote")
env.MockGitCommand(pwd, tc.RemoteURL, "remote", "get-url", tc.Remote) env.MockGitCommand(pwd, tc.RemoteURL, "remote", "get-url", tc.Remote)
g := &Git{
scm: scm{ props := properties.Map{
env: env,
props: properties.Map{
FetchBareInfo: true, FetchBareInfo: true,
FetchUpstreamIcon: tc.FetchRemote, FetchUpstreamIcon: tc.FetchRemote,
},
},
} }
g := &Git{}
g.Init(props, env)
assert.Equal(t, g.Enabled(), tc.ExpectedEnabled, tc.Case) assert.Equal(t, g.Enabled(), tc.ExpectedEnabled, tc.Case)
assert.Equal(t, g.Ref, tc.ExpectedHEAD, tc.Case) assert.Equal(t, g.Ref, tc.ExpectedHEAD, tc.Case)
assert.Equal(t, g.UpstreamIcon, tc.ExpectedRemote, tc.Case) assert.Equal(t, g.UpstreamIcon, tc.ExpectedRemote, tc.Case)
@ -221,13 +215,14 @@ func TestGetGitOutputForCommand(t *testing.T) {
env.On("IsWsl").Return(false) env.On("IsWsl").Return(false)
env.On("RunCommand", "git", append(args, commandArgs...)).Return(want, nil) env.On("RunCommand", "git", append(args, commandArgs...)).Return(want, nil)
env.On("GOOS").Return("unix") env.On("GOOS").Return("unix")
g := &Git{ g := &Git{
scm: scm{ scm: scm{
env: env,
props: properties.Map{},
command: GITCOMMAND, command: GITCOMMAND,
}, },
} }
g.Init(properties.Map{}, env)
got := g.getGitCommandOutput(commandArgs...) got := g.getGitCommandOutput(commandArgs...)
assert.Equal(t, want, got) assert.Equal(t, want, got)
} }
@ -366,10 +361,7 @@ func TestSetGitHEADContextClean(t *testing.T) {
env.On("HasFilesInDir", "", "sequencer/todo").Return(tc.Sequencer) env.On("HasFilesInDir", "", "sequencer/todo").Return(tc.Sequencer)
env.On("FileContent", "/sequencer/todo").Return(tc.Theirs) env.On("FileContent", "/sequencer/todo").Return(tc.Theirs)
g := &Git{ props := properties.Map{
scm: scm{
env: env,
props: properties.Map{
BranchIcon: "branch ", BranchIcon: "branch ",
CommitIcon: "commit ", CommitIcon: "commit ",
RebaseIcon: "rebase ", RebaseIcon: "rebase ",
@ -377,12 +369,17 @@ func TestSetGitHEADContextClean(t *testing.T) {
CherryPickIcon: "pick ", CherryPickIcon: "pick ",
TagIcon: "tag ", TagIcon: "tag ",
RevertIcon: "revert ", RevertIcon: "revert ",
}, }
g := &Git{
scm: scm{
command: GITCOMMAND, command: GITCOMMAND,
}, },
ShortHash: "1234567", ShortHash: "1234567",
Ref: tc.Ref, Ref: tc.Ref,
} }
g.Init(props, env)
g.setGitHEADContext() g.setGitHEADContext()
assert.Equal(t, tc.Expected, g.HEAD, tc.Case) assert.Equal(t, tc.Expected, g.HEAD, tc.Case)
} }
@ -409,18 +406,21 @@ func TestSetPrettyHEADName(t *testing.T) {
env.On("GOOS").Return("unix") env.On("GOOS").Return("unix")
env.On("IsWsl").Return(false) env.On("IsWsl").Return(false)
env.MockGitCommand("", tc.Tag, "describe", "--tags", "--exact-match") env.MockGitCommand("", tc.Tag, "describe", "--tags", "--exact-match")
g := &Git{
scm: scm{ props := properties.Map{
env: env,
props: properties.Map{
BranchIcon: "branch ", BranchIcon: "branch ",
CommitIcon: "commit ", CommitIcon: "commit ",
TagIcon: "tag ", TagIcon: "tag ",
}, }
g := &Git{
scm: scm{
command: GITCOMMAND, command: GITCOMMAND,
}, },
ShortHash: tc.ShortHash, ShortHash: tc.ShortHash,
} }
g.Init(props, env)
g.setPrettyHEADName() g.setPrettyHEADName()
assert.Equal(t, tc.Expected, g.HEAD, tc.Case) assert.Equal(t, tc.Expected, g.HEAD, tc.Case)
} }
@ -579,13 +579,14 @@ func TestSetGitStatus(t *testing.T) {
env.On("GOOS").Return("unix") env.On("GOOS").Return("unix")
env.On("IsWsl").Return(false) env.On("IsWsl").Return(false)
env.MockGitCommand("", strings.ReplaceAll(tc.Output, "\t", ""), "status", "-unormal", "--branch", "--porcelain=2") env.MockGitCommand("", strings.ReplaceAll(tc.Output, "\t", ""), "status", "-unormal", "--branch", "--porcelain=2")
g := &Git{ g := &Git{
scm: scm{ scm: scm{
env: env,
props: properties.Map{},
command: GITCOMMAND, command: GITCOMMAND,
}, },
} }
g.Init(properties.Map{}, env)
if tc.ExpectedWorking == nil { if tc.ExpectedWorking == nil {
tc.ExpectedWorking = &GitStatus{} tc.ExpectedWorking = &GitStatus{}
} }
@ -620,12 +621,14 @@ func TestGetStashContextZeroEntries(t *testing.T) {
for _, tc := range cases { for _, tc := range cases {
env := new(mock.Environment) env := new(mock.Environment)
env.On("FileContent", "/logs/refs/stash").Return(tc.StashContent) env.On("FileContent", "/logs/refs/stash").Return(tc.StashContent)
g := &Git{ g := &Git{
scm: scm{ scm: scm{
env: env,
workingDir: "", workingDir: "",
}, },
} }
g.Init(properties.Map{}, env)
got := g.StashCount() got := g.StashCount()
assert.Equal(t, tc.Expected, got) assert.Equal(t, tc.Expected, got)
} }
@ -697,14 +700,15 @@ func TestGitUpstream(t *testing.T) {
"src.example.com": "EX", "src.example.com": "EX",
}, },
} }
g := &Git{ g := &Git{
scm: scm{ scm: scm{
env: env,
props: props,
command: GITCOMMAND, command: GITCOMMAND,
}, },
Upstream: "origin/main", Upstream: "origin/main",
} }
g.Init(props, env)
upstreamIcon := g.getUpstreamIcon() upstreamIcon := g.getUpstreamIcon()
assert.Equal(t, tc.Expected, upstreamIcon, tc.Case) assert.Equal(t, tc.Expected, upstreamIcon, tc.Case)
} }
@ -735,15 +739,15 @@ func TestGetBranchStatus(t *testing.T) {
BranchIdenticalIcon: "equal", BranchIdenticalIcon: "equal",
BranchGoneIcon: "gone", BranchGoneIcon: "gone",
} }
g := &Git{ g := &Git{
scm: scm{
props: props,
},
Ahead: tc.Ahead, Ahead: tc.Ahead,
Behind: tc.Behind, Behind: tc.Behind,
Upstream: tc.Upstream, Upstream: tc.Upstream,
UpstreamGone: tc.UpstreamGone, UpstreamGone: tc.UpstreamGone,
} }
g.Init(props, new(mock.Environment))
g.setBranchStatus() g.setBranchStatus()
assert.Equal(t, tc.Expected, g.BranchStatus, tc.Case) assert.Equal(t, tc.Expected, g.BranchStatus, tc.Case)
} }
@ -919,14 +923,17 @@ func TestGitUntrackedMode(t *testing.T) {
} }
for _, tc := range cases { for _, tc := range cases {
props := properties.Map{
UntrackedModes: tc.UntrackedModes,
}
g := &Git{ g := &Git{
scm: scm{ scm: scm{
props: properties.Map{
UntrackedModes: tc.UntrackedModes,
},
realDir: "foo", realDir: "foo",
}, },
} }
g.Init(props, new(mock.Environment))
got := g.getUntrackedFilesMode() got := g.getUntrackedFilesMode()
assert.Equal(t, tc.Expected, got, tc.Case) assert.Equal(t, tc.Expected, got, tc.Case)
} }
@ -961,14 +968,17 @@ func TestGitIgnoreSubmodules(t *testing.T) {
} }
for _, tc := range cases { for _, tc := range cases {
props := properties.Map{
IgnoreSubmodules: tc.IgnoreSubmodules,
}
g := &Git{ g := &Git{
scm: scm{ scm: scm{
props: properties.Map{
IgnoreSubmodules: tc.IgnoreSubmodules,
},
realDir: "foo", realDir: "foo",
}, },
} }
g.Init(props, new(mock.Environment))
got := g.getIgnoreSubmodulesMode() got := g.getIgnoreSubmodulesMode()
assert.Equal(t, tc.Expected, got, tc.Case) assert.Equal(t, tc.Expected, got, tc.Case)
} }
@ -1093,12 +1103,14 @@ func TestGitCommit(t *testing.T) {
for _, tc := range cases { for _, tc := range cases {
env := new(mock.Environment) env := new(mock.Environment)
env.MockGitCommand("", tc.Output, "log", "-1", "--pretty=format:an:%an%nae:%ae%ncn:%cn%nce:%ce%nat:%at%nsu:%s%nha:%H%nrf:%D", "--decorate=full") env.MockGitCommand("", tc.Output, "log", "-1", "--pretty=format:an:%an%nae:%ae%ncn:%cn%nce:%ce%nat:%at%nsu:%s%nha:%H%nrf:%D", "--decorate=full")
g := &Git{ g := &Git{
scm: scm{ scm: scm{
env: env, command: GITCOMMAND,
command: "git",
}, },
} }
g.Init(properties.Map{}, env)
got := g.Commit() got := g.Commit()
assert.Equal(t, tc.Expected, got, tc.Case) assert.Equal(t, tc.Expected, got, tc.Case)
} }
@ -1148,11 +1160,10 @@ func TestGitRemotes(t *testing.T) {
g := &Git{ g := &Git{
scm: scm{ scm: scm{
props: properties.Map{},
realDir: "foo", realDir: "foo",
env: env,
}, },
} }
g.Init(properties.Map{}, env)
got := g.Remotes() got := g.Remotes()
assert.Equal(t, tc.Expected, len(got), tc.Case) assert.Equal(t, tc.Expected, len(got), tc.Case)
@ -1194,13 +1205,12 @@ func TestGitRepoName(t *testing.T) {
g := &Git{ g := &Git{
scm: scm{ scm: scm{
props: properties.Map{},
env: env,
realDir: tc.RealDir, realDir: tc.RealDir,
workingDir: tc.WorkingDir, workingDir: tc.WorkingDir,
}, },
IsWorkTree: tc.IsWorkTree, IsWorkTree: tc.IsWorkTree,
} }
g.Init(properties.Map{}, env)
got := g.repoName() got := g.repoName()
assert.Equal(t, tc.Expected, got, tc.Case) assert.Equal(t, tc.Expected, got, tc.Case)

View file

@ -2,9 +2,6 @@ package segments
import ( import (
"encoding/json" "encoding/json"
"github.com/jandedobbeleer/oh-my-posh/src/properties"
"github.com/jandedobbeleer/oh-my-posh/src/runtime"
) )
type gitVersion struct { type gitVersion struct {
@ -44,8 +41,7 @@ type gitVersion struct {
} }
type GitVersion struct { type GitVersion struct {
props properties.Properties base
env runtime.Environment
gitVersion gitVersion
} }
@ -70,8 +66,3 @@ func (n *GitVersion) Enabled() bool {
return err == nil return err == nil
} }
func (n *GitVersion) Init(props properties.Properties, env runtime.Environment) {
n.props = props
n.env = env
}

View file

@ -47,10 +47,9 @@ func TestGitversion(t *testing.T) {
env.On("Pwd").Return("test-dir") env.On("Pwd").Return("test-dir")
env.On("RunCommand", "gitversion", []string{"-output", "json"}).Return(tc.Response, tc.CommandError) env.On("RunCommand", "gitversion", []string{"-output", "json"}).Return(tc.Response, tc.CommandError)
gitversion := &GitVersion{ gitversion := &GitVersion{}
env: env, gitversion.Init(properties.Map{}, env)
props: properties.Map{},
}
if len(tc.Template) == 0 { if len(tc.Template) == 0 {
tc.Template = gitversion.Template() tc.Template = gitversion.Template()
} }

View file

@ -2,7 +2,6 @@ package segments
import ( import (
"github.com/jandedobbeleer/oh-my-posh/src/properties" "github.com/jandedobbeleer/oh-my-posh/src/properties"
"github.com/jandedobbeleer/oh-my-posh/src/runtime"
"golang.org/x/mod/modfile" "golang.org/x/mod/modfile"
) )
@ -19,26 +18,6 @@ func (g *Golang) Template() string {
return languageTemplate return languageTemplate
} }
func (g *Golang) Init(props properties.Properties, env runtime.Environment) {
g.language = language{
env: env,
props: props,
extensions: []string{"*.go", "go.mod"},
commands: []*cmd{
{
regex: `(?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+)(.(?P<patch>[0-9]+))?))`,
getVersion: g.getVersion,
},
{
executable: "go",
args: []string{"version"},
regex: `(?:go(?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+)(.(?P<patch>[0-9]+))?)))`,
},
},
versionURLTemplate: "https://golang.org/doc/go{{ .Major }}.{{ .Minor }}",
}
}
func (g *Golang) getVersion() (string, error) { func (g *Golang) getVersion() (string, error) {
if !g.props.GetBool(ParseModFile, false) { if !g.props.GetBool(ParseModFile, false) {
return "", nil return "", nil
@ -56,5 +35,19 @@ func (g *Golang) getVersion() (string, error) {
} }
func (g *Golang) Enabled() bool { func (g *Golang) Enabled() bool {
g.extensions = []string{"*.go", "go.mod"}
g.commands = []*cmd{
{
regex: `(?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+)(.(?P<patch>[0-9]+))?))`,
getVersion: g.getVersion,
},
{
executable: "go",
args: []string{"version"},
regex: `(?:go(?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+)(.(?P<patch>[0-9]+))?)))`,
},
}
g.versionURLTemplate = "https://golang.org/doc/go{{ .Major }}.{{ .Minor }}"
return g.language.Enabled() return g.language.Enabled()
} }

View file

@ -2,7 +2,6 @@ package segments
import ( import (
"github.com/jandedobbeleer/oh-my-posh/src/properties" "github.com/jandedobbeleer/oh-my-posh/src/properties"
"github.com/jandedobbeleer/oh-my-posh/src/runtime"
) )
type Haskell struct { type Haskell struct {
@ -19,7 +18,7 @@ func (h *Haskell) Template() string {
return languageTemplate return languageTemplate
} }
func (h *Haskell) Init(props properties.Properties, env runtime.Environment) { func (h *Haskell) Enabled() bool {
ghcRegex := `(?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+).(?P<patch>[0-9]+)))` ghcRegex := `(?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+).(?P<patch>[0-9]+)))`
ghcCmd := &cmd{ ghcCmd := &cmd{
executable: "ghc", executable: "ghc",
@ -33,13 +32,9 @@ func (h *Haskell) Init(props properties.Properties, env runtime.Environment) {
regex: ghcRegex, regex: ghcRegex,
} }
h.language = language{ h.extensions = []string{"*.hs", "*.lhs", "stack.yaml", "package.yaml", "*.cabal", "cabal.project"}
env: env, h.commands = []*cmd{ghcCmd}
props: props, h.versionURLTemplate = "https://www.haskell.org/ghc/download_ghc_{{ .Major }}_{{ .Minor }}_{{ .Patch }}.html"
extensions: []string{"*.hs", "*.lhs", "stack.yaml", "package.yaml", "*.cabal", "cabal.project"},
commands: []*cmd{ghcCmd},
versionURLTemplate: "https://www.haskell.org/ghc/download_ghc_{{ .Major }}_{{ .Minor }}_{{ .Patch }}.html",
}
switch h.props.GetString(StackGhcMode, "never") { switch h.props.GetString(StackGhcMode, "never") {
case "always": case "always":
@ -52,8 +47,6 @@ func (h *Haskell) Init(props properties.Properties, env runtime.Environment) {
h.StackGhc = true h.StackGhc = true
} }
} }
}
func (h *Haskell) Enabled() bool {
return h.language.Enabled() return h.language.Enabled()
} }

View file

@ -1,13 +1,7 @@
package segments package segments
import (
"github.com/jandedobbeleer/oh-my-posh/src/properties"
"github.com/jandedobbeleer/oh-my-posh/src/runtime"
)
type Helm struct { type Helm struct {
props properties.Properties base
env runtime.Environment
Version string Version string
} }
@ -34,11 +28,6 @@ func (h *Helm) Template() string {
return " Helm {{.Version}}" return " Helm {{.Version}}"
} }
func (h *Helm) Init(props properties.Properties, env runtime.Environment) {
h.props = props
h.env = env
}
func (h *Helm) getVersion() bool { func (h *Helm) getVersion() bool {
cmd := "helm" cmd := "helm"
if !h.env.HasCommand(cmd) { if !h.env.HasCommand(cmd) {

View file

@ -93,10 +93,9 @@ func TestHelmSegment(t *testing.T) {
DisplayMode: tc.DisplayMode, DisplayMode: tc.DisplayMode,
} }
h := &Helm{ h := &Helm{}
env: env, h.Init(props, env)
props: props,
}
assert.Equal(t, tc.ExpectedEnabled, h.Enabled(), tc.Case) assert.Equal(t, tc.ExpectedEnabled, h.Enabled(), tc.Case)
if tc.ExpectedEnabled { if tc.ExpectedEnabled {
assert.Equal(t, tc.ExpectedString, renderTemplate(env, h.Template(), h), tc.Case) assert.Equal(t, tc.ExpectedString, renderTemplate(env, h.Template(), h), tc.Case)

View file

@ -4,7 +4,6 @@ import (
"net" "net"
"github.com/jandedobbeleer/oh-my-posh/src/properties" "github.com/jandedobbeleer/oh-my-posh/src/properties"
"github.com/jandedobbeleer/oh-my-posh/src/runtime"
"github.com/jandedobbeleer/oh-my-posh/src/runtime/http" "github.com/jandedobbeleer/oh-my-posh/src/runtime/http"
) )
@ -26,6 +25,8 @@ func (i *ipAPI) Get() (*ipData, error) {
} }
type IPify struct { type IPify struct {
base
api IPAPI api IPAPI
IP string IP string
} }
@ -41,6 +42,8 @@ func (i *IPify) Template() string {
} }
func (i *IPify) Enabled() bool { func (i *IPify) Enabled() bool {
i.initAPI()
ip, err := i.getResult() ip, err := i.getResult()
if err != nil { if err != nil {
return false return false
@ -55,16 +58,22 @@ func (i *IPify) getResult() (string, error) {
if dnsErr, OK := err.(*net.DNSError); OK && dnsErr.IsNotFound { if dnsErr, OK := err.(*net.DNSError); OK && dnsErr.IsNotFound {
return OFFLINE, nil return OFFLINE, nil
} }
if err != nil { if err != nil {
return "", err return "", err
} }
return data.IP, err return data.IP, err
} }
func (i *IPify) Init(props properties.Properties, env runtime.Environment) { func (i *IPify) initAPI() {
if i.api != nil {
return
}
request := &http.Request{ request := &http.Request{
Env: env, Env: i.env,
HTTPTimeout: props.GetInt(properties.HTTPTimeout, properties.DefaultHTTPTimeout), HTTPTimeout: i.props.GetInt(properties.HTTPTimeout, properties.DefaultHTTPTimeout),
} }
i.api = &ipAPI{ i.api = &ipAPI{

View file

@ -11,10 +11,6 @@ import (
testify_ "github.com/stretchr/testify/mock" testify_ "github.com/stretchr/testify/mock"
) )
const (
IPIFYAPIURL = "https://api.ipify.org"
)
type mockedipAPI struct { type mockedipAPI struct {
testify_.Mock testify_.Mock
} }

View file

@ -2,9 +2,6 @@ package segments
import ( import (
"fmt" "fmt"
"github.com/jandedobbeleer/oh-my-posh/src/properties"
"github.com/jandedobbeleer/oh-my-posh/src/runtime"
) )
type Java struct { type Java struct {
@ -15,17 +12,21 @@ func (j *Java) Template() string {
return languageTemplate return languageTemplate
} }
func (j *Java) Init(props properties.Properties, env runtime.Environment) { func (j *Java) Enabled() bool {
j.init()
return j.language.Enabled()
}
func (j *Java) init() {
javaRegex := `(?: JRE)(?: \(.*\))? \((?P<version>(?P<major>[0-9]+)(?:\.(?P<minor>[0-9]+))?(?:\.(?P<patch>[0-9]+))?).*\),` javaRegex := `(?: JRE)(?: \(.*\))? \((?P<version>(?P<major>[0-9]+)(?:\.(?P<minor>[0-9]+))?(?:\.(?P<patch>[0-9]+))?).*\),`
javaCmd := &cmd{ javaCmd := &cmd{
executable: "java", executable: "java",
args: []string{"-Xinternalversion"}, args: []string{"-Xinternalversion"},
regex: javaRegex, regex: javaRegex,
} }
j.language = language{
env: env, j.extensions = []string{
props: props,
extensions: []string{
"pom.xml", "pom.xml",
"build.gradle.kts", "build.gradle.kts",
"build.sbt", "build.sbt",
@ -39,12 +40,12 @@ func (j *Java) Init(props properties.Properties, env runtime.Environment) {
"*.jar", "*.jar",
"*.clj", "*.clj",
"*.cljc", "*.cljc",
},
} }
javaHome := j.language.env.Getenv("JAVA_HOME")
javaHome := j.env.Getenv("JAVA_HOME")
if len(javaHome) > 0 { if len(javaHome) > 0 {
java := fmt.Sprintf("%s/bin/java", javaHome) java := fmt.Sprintf("%s/bin/java", javaHome)
j.language.commands = []*cmd{ j.commands = []*cmd{
{ {
executable: java, executable: java,
args: []string{"-Xinternalversion"}, args: []string{"-Xinternalversion"},
@ -54,9 +55,6 @@ func (j *Java) Init(props properties.Properties, env runtime.Environment) {
} }
return return
} }
j.language.commands = []*cmd{javaCmd}
}
func (j *Java) Enabled() bool { j.commands = []*cmd{javaCmd}
return j.language.Enabled()
} }

View file

@ -1,10 +1,5 @@
package segments package segments
import (
"github.com/jandedobbeleer/oh-my-posh/src/properties"
"github.com/jandedobbeleer/oh-my-posh/src/runtime"
)
type Julia struct { type Julia struct {
language language
} }
@ -13,22 +8,16 @@ func (j *Julia) Template() string {
return languageTemplate return languageTemplate
} }
func (j *Julia) Init(props properties.Properties, env runtime.Environment) { func (j *Julia) Enabled() bool {
j.language = language{ j.extensions = []string{"*.jl"}
env: env, j.commands = []*cmd{
props: props,
extensions: []string{"*.jl"},
commands: []*cmd{
{ {
executable: "julia", executable: "julia",
args: []string{"--version"}, args: []string{"--version"},
regex: `julia version (?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+).(?P<patch>[0-9]+)))`, regex: `julia version (?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+).(?P<patch>[0-9]+)))`,
}, },
},
versionURLTemplate: "https://github.com/JuliaLang/julia/releases/tag/v{{ .Full }}",
}
} }
j.versionURLTemplate = "https://github.com/JuliaLang/julia/releases/tag/v{{ .Full }}"
func (j *Julia) Enabled() bool {
return j.language.Enabled() return j.language.Enabled()
} }

View file

@ -1,10 +1,5 @@
package segments package segments
import (
"github.com/jandedobbeleer/oh-my-posh/src/properties"
"github.com/jandedobbeleer/oh-my-posh/src/runtime"
)
type Kotlin struct { type Kotlin struct {
language language
} }
@ -13,22 +8,16 @@ func (k *Kotlin) Template() string {
return languageTemplate return languageTemplate
} }
func (k *Kotlin) Init(props properties.Properties, env runtime.Environment) { func (k *Kotlin) Enabled() bool {
k.language = language{ k.extensions = []string{"*.kt", "*.kts", "*.ktm"}
env: env, k.commands = []*cmd{
props: props,
extensions: []string{"*.kt", "*.kts", "*.ktm"},
commands: []*cmd{
{ {
executable: "kotlin", executable: "kotlin",
args: []string{"-version"}, args: []string{"-version"},
regex: `Kotlin version (?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+).(?P<patch>[0-9]+)))`, regex: `Kotlin version (?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+).(?P<patch>[0-9]+)))`,
}, },
},
versionURLTemplate: "https://github.com/JetBrains/kotlin/releases/tag/v{{ .Full }}",
}
} }
k.versionURLTemplate = "https://github.com/JetBrains/kotlin/releases/tag/v{{ .Full }}"
func (k *Kotlin) Enabled() bool {
return k.language.Enabled() return k.language.Enabled()
} }

View file

@ -4,7 +4,6 @@ import (
"path/filepath" "path/filepath"
"github.com/jandedobbeleer/oh-my-posh/src/properties" "github.com/jandedobbeleer/oh-my-posh/src/properties"
"github.com/jandedobbeleer/oh-my-posh/src/runtime"
"gopkg.in/yaml.v3" "gopkg.in/yaml.v3"
) )
@ -17,8 +16,8 @@ const (
) )
type Kubectl struct { type Kubectl struct {
props properties.Properties base
env runtime.Environment
KubeContext KubeContext
Context string Context string
dirty bool dirty bool
@ -42,11 +41,6 @@ func (k *Kubectl) Template() string {
return " {{ .Context }}{{ if .Namespace }} :: {{ .Namespace }}{{ end }} " return " {{ .Context }}{{ if .Namespace }} :: {{ .Namespace }}{{ end }} "
} }
func (k *Kubectl) Init(props properties.Properties, env runtime.Environment) {
k.props = props
k.env = env
}
func (k *Kubectl) Enabled() bool { func (k *Kubectl) Enabled() bool {
parseKubeConfig := k.props.GetBool(ParseKubeConfig, true) parseKubeConfig := k.props.GetBool(ParseKubeConfig, true)

View file

@ -158,15 +158,15 @@ func TestKubectlSegment(t *testing.T) {
env.On("Home").Return("testhome") env.On("Home").Return("testhome")
k := &Kubectl{ props := properties.Map{
env: env,
props: properties.Map{
properties.DisplayError: tc.DisplayError, properties.DisplayError: tc.DisplayError,
ParseKubeConfig: tc.ParseKubeConfig, ParseKubeConfig: tc.ParseKubeConfig,
ContextAliases: tc.ContextAliases, ContextAliases: tc.ContextAliases,
},
} }
k := &Kubectl{}
k.Init(props, env)
assert.Equal(t, tc.ExpectedEnabled, k.Enabled(), tc.Case) assert.Equal(t, tc.ExpectedEnabled, k.Enabled(), tc.Case)
if tc.ExpectedEnabled { if tc.ExpectedEnabled {
assert.Equal(t, tc.ExpectedString, renderTemplate(env, tc.Template, k), tc.Case) assert.Equal(t, tc.ExpectedString, renderTemplate(env, tc.Template, k), tc.Case)

View file

@ -60,8 +60,8 @@ func (c *cmd) parse(versionInfo string) (*version, error) {
} }
type language struct { type language struct {
env runtime.Environment base
props properties.Properties
projectRoot *runtime.FileInfo projectRoot *runtime.FileInfo
loadContext loadContext loadContext loadContext
inContext inContext inContext inContext

View file

@ -64,13 +64,12 @@ func bootStrapLanguageTest(args *languageArgs) *language {
} }
l := &language{ l := &language{
props: args.properties,
env: env,
extensions: args.extensions, extensions: args.extensions,
commands: args.commands, commands: args.commands,
versionURLTemplate: args.versionURLTemplate, versionURLTemplate: args.versionURLTemplate,
matchesVersionFile: args.matchesVersionFile, matchesVersionFile: args.matchesVersionFile,
} }
l.Init(args.properties, env)
return l return l
} }

View file

@ -6,12 +6,10 @@ import (
"fmt" "fmt"
"github.com/jandedobbeleer/oh-my-posh/src/properties" "github.com/jandedobbeleer/oh-my-posh/src/properties"
"github.com/jandedobbeleer/oh-my-posh/src/runtime"
) )
type LastFM struct { type LastFM struct {
props properties.Properties base
env runtime.Environment
Artist string Artist string
Track string Track string
@ -120,8 +118,3 @@ func (d *LastFM) setStatus() error {
return nil return nil
} }
func (d *LastFM) Init(props properties.Properties, env runtime.Environment) {
d.props = props
d.env = env
}

View file

@ -63,20 +63,18 @@ func TestLFMSegmentSingle(t *testing.T) {
env.On("HTTPRequest", LFMAPIURL).Return([]byte(tc.APIJSONResponse), tc.Error) env.On("HTTPRequest", LFMAPIURL).Return([]byte(tc.APIJSONResponse), tc.Error)
env.On("Error", testify_.Anything) env.On("Error", testify_.Anything)
o := &LastFM{ lfm := &LastFM{}
props: props, lfm.Init(props, env)
env: env,
}
enabled := o.Enabled() enabled := lfm.Enabled()
assert.Equal(t, tc.ExpectedEnabled, enabled, tc.Case) assert.Equal(t, tc.ExpectedEnabled, enabled, tc.Case)
if !enabled { if !enabled {
continue continue
} }
if tc.Template == "" { if tc.Template == "" {
tc.Template = o.Template() tc.Template = lfm.Template()
} }
assert.Equal(t, tc.ExpectedString, renderTemplate(env, tc.Template, o), tc.Case) assert.Equal(t, tc.ExpectedString, renderTemplate(env, tc.Template, lfm), tc.Case)
} }
} }

View file

@ -2,7 +2,6 @@ package segments
import ( import (
"github.com/jandedobbeleer/oh-my-posh/src/properties" "github.com/jandedobbeleer/oh-my-posh/src/properties"
"github.com/jandedobbeleer/oh-my-posh/src/runtime"
) )
type Lua struct { type Lua struct {
@ -17,13 +16,10 @@ func (l *Lua) Template() string {
return languageTemplate return languageTemplate
} }
func (l *Lua) Init(props properties.Properties, env runtime.Environment) { func (l *Lua) Enabled() bool {
l.language = language{ l.extensions = []string{"*.lua", "*.rockspec"}
env: env, l.folders = []string{"lua"}
props: props, l.commands = []*cmd{
extensions: []string{"*.lua", "*.rockspec"},
folders: []string{"lua"},
commands: []*cmd{
{ {
executable: "lua", executable: "lua",
args: []string{"-v"}, args: []string{"-v"},
@ -36,13 +32,11 @@ func (l *Lua) Init(props properties.Properties, env runtime.Environment) {
regex: `LuaJIT (?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+)(.(?P<patch>[0-9]+))?))`, regex: `LuaJIT (?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+)(.(?P<patch>[0-9]+))?))`,
versionURLTemplate: "https://github.com/LuaJIT/LuaJIT/tree/v{{ .Major}}.{{ .Minor}}", versionURLTemplate: "https://github.com/LuaJIT/LuaJIT/tree/v{{ .Major}}.{{ .Minor}}",
}, },
},
} }
if l.props.GetString(PreferredExecutable, "lua") == "luajit" { if l.props.GetString(PreferredExecutable, "lua") == "luajit" {
l.commands = []*cmd{l.commands[1], l.commands[0]} l.commands = []*cmd{l.commands[1], l.commands[0]}
} }
}
func (l *Lua) Enabled() bool {
return l.language.Enabled() return l.language.Enabled()
} }

View file

@ -16,12 +16,8 @@ func TestMercurialEnabledToolNotFound(t *testing.T) {
env.On("GOOS").Return("") env.On("GOOS").Return("")
env.On("IsWsl").Return(false) env.On("IsWsl").Return(false)
hg := &Mercurial{ hg := &Mercurial{}
scm: scm{ hg.Init(properties.Map{}, env)
env: env,
props: properties.Map{},
},
}
assert.False(t, hg.Enabled()) assert.False(t, hg.Enabled())
} }
@ -42,12 +38,8 @@ func TestMercurialEnabledInWorkingDirectory(t *testing.T) {
env.On("Home").Return(poshHome) env.On("Home").Return(poshHome)
env.On("Getenv", poshGitEnv).Return("") env.On("Getenv", poshGitEnv).Return("")
hg := &Mercurial{ hg := &Mercurial{}
scm: scm{ hg.Init(properties.Map{}, env)
env: env,
props: properties.Map{},
},
}
assert.True(t, hg.Enabled()) assert.True(t, hg.Enabled())
assert.Equal(t, fileInfo.Path, hg.workingDir) assert.Equal(t, fileInfo.Path, hg.workingDir)
@ -142,6 +134,7 @@ A Added.File
ParentFolder: "/dir", ParentFolder: "/dir",
IsDir: true, IsDir: true,
} }
props := properties.Map{ props := properties.Map{
FetchStatus: true, FetchStatus: true,
} }
@ -158,12 +151,8 @@ A Added.File
env.MockHgCommand(fileInfo.Path, tc.LogOutput, "log", "-r", ".", "--template", hgLogTemplate) env.MockHgCommand(fileInfo.Path, tc.LogOutput, "log", "-r", ".", "--template", hgLogTemplate)
env.MockHgCommand(fileInfo.Path, tc.StatusOutput, "status") env.MockHgCommand(fileInfo.Path, tc.StatusOutput, "status")
hg := &Mercurial{ hg := &Mercurial{}
scm: scm{ hg.Init(props, env)
env: env,
props: props,
},
}
if tc.ExpectedWorking != nil { if tc.ExpectedWorking != nil {
tc.ExpectedWorking.Formats = map[string]string{} tc.ExpectedWorking.Formats = map[string]string{}

View file

@ -1,39 +1,28 @@
package segments package segments
import (
"github.com/jandedobbeleer/oh-my-posh/src/properties"
"github.com/jandedobbeleer/oh-my-posh/src/runtime"
)
type Mvn struct { type Mvn struct {
language language
} }
func (m *Mvn) Enabled() bool { func (m *Mvn) Enabled() bool {
m.extensions = []string{"pom.xml"}
m.commands = []*cmd{
{
executable: "mvn",
args: []string{"--version"},
regex: `(?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+).(?P<patch>[0-9]+)(?:-(?P<prerelease>[a-z]+-[0-9]+))?))`,
},
}
m.versionURLTemplate = "https://github.com/apache/maven/releases/tag/maven-{{ .Full }}"
mvnw, err := m.env.HasParentFilePath("mvnw", false)
if err == nil {
m.commands[0].executable = mvnw.Path
}
return m.language.Enabled() return m.language.Enabled()
} }
func (m *Mvn) Template() string { func (m *Mvn) Template() string {
return languageTemplate return languageTemplate
} }
func (m *Mvn) Init(props properties.Properties, env runtime.Environment) {
m.language = language{
env: env,
props: props,
extensions: []string{"pom.xml"},
commands: []*cmd{
{
executable: "mvn",
args: []string{"--version"},
regex: `(?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+).(?P<patch>[0-9]+)(?:-(?P<prerelease>[a-z]+-[0-9]+))?))`,
},
},
versionURLTemplate: "https://github.com/apache/maven/releases/tag/maven-{{ .Full }}",
}
mvnw, err := m.language.env.HasParentFilePath("mvnw", false)
if err == nil {
m.language.commands[0].executable = mvnw.Path
}
}

View file

@ -7,13 +7,11 @@ import (
"time" "time"
"github.com/jandedobbeleer/oh-my-posh/src/properties" "github.com/jandedobbeleer/oh-my-posh/src/properties"
"github.com/jandedobbeleer/oh-my-posh/src/runtime"
) )
// segment struct, makes templating easier // segment struct, makes templating easier
type Nba struct { type Nba struct {
props properties.Properties base
env runtime.Environment
NBAData NBAData
} }
@ -310,8 +308,3 @@ func (nba *Nba) getResult() (*NBAData, error) {
return data, nil return data, nil
} }
func (nba *Nba) Init(props properties.Properties, env runtime.Environment) {
nba.props = props
nba.env = env
}

View file

@ -94,10 +94,8 @@ func TestNBASegment(t *testing.T) {
env.On("HTTPRequest", scheduleURLEndpoint).Return([]byte(tc.JSONResponse), tc.Error) env.On("HTTPRequest", scheduleURLEndpoint).Return([]byte(tc.JSONResponse), tc.Error)
} }
nba := &Nba{ nba := &Nba{}
props: props, nba.Init(props, env)
env: env,
}
enabled := nba.Enabled() enabled := nba.Enabled()
assert.Equal(t, tc.ExpectedEnabled, enabled, tc.Case) assert.Equal(t, tc.ExpectedEnabled, enabled, tc.Case)

View file

@ -2,14 +2,10 @@ package segments
import ( import (
"encoding/json" "encoding/json"
"github.com/jandedobbeleer/oh-my-posh/src/properties"
"github.com/jandedobbeleer/oh-my-posh/src/runtime"
) )
type Nbgv struct { type Nbgv struct {
props properties.Properties base
env runtime.Environment
VersionInfo VersionInfo
} }
@ -45,8 +41,3 @@ func (n *Nbgv) Enabled() bool {
} }
return n.VersionInfo.VersionFileFound return n.VersionInfo.VersionFileFound
} }
func (n *Nbgv) Init(props properties.Properties, env runtime.Environment) {
n.props = props
n.env = env
}

View file

@ -63,11 +63,12 @@ func TestNbgv(t *testing.T) {
env := new(mock.Environment) env := new(mock.Environment)
env.On("HasCommand", "nbgv").Return(tc.HasNbgv) env.On("HasCommand", "nbgv").Return(tc.HasNbgv)
env.On("RunCommand", "nbgv", []string{"get-version", "--format=json"}).Return(tc.Response, tc.Error) env.On("RunCommand", "nbgv", []string{"get-version", "--format=json"}).Return(tc.Response, tc.Error)
nbgv := &Nbgv{
env: env, nbgv := &Nbgv{}
props: properties.Map{}, nbgv.Init(properties.Map{}, env)
}
enabled := nbgv.Enabled() enabled := nbgv.Enabled()
assert.Equal(t, tc.ExpectedEnabled, enabled, tc.Case) assert.Equal(t, tc.ExpectedEnabled, enabled, tc.Case)
if tc.Template == "" { if tc.Template == "" {
tc.Template = nbgv.Template() tc.Template = nbgv.Template()

View file

@ -7,13 +7,12 @@ import (
"time" "time"
"github.com/jandedobbeleer/oh-my-posh/src/properties" "github.com/jandedobbeleer/oh-my-posh/src/properties"
"github.com/jandedobbeleer/oh-my-posh/src/runtime"
) )
// segment struct, makes templating easier // segment struct, makes templating easier
type Nightscout struct { type Nightscout struct {
props properties.Properties base
env runtime.Environment
TrendIcon string TrendIcon string
NightscoutData NightscoutData
} }
@ -124,8 +123,3 @@ func (ns *Nightscout) getResult() (*NightscoutData, error) {
return data, nil return data, nil
} }
func (ns *Nightscout) Init(props properties.Properties, env runtime.Environment) {
ns.props = props
ns.env = env
}

View file

@ -120,10 +120,8 @@ func TestNSSegment(t *testing.T) {
env.On("HTTPRequest", FAKEAPIURL).Return([]byte(tc.JSONResponse), tc.Error) env.On("HTTPRequest", FAKEAPIURL).Return([]byte(tc.JSONResponse), tc.Error)
ns := &Nightscout{ ns := &Nightscout{}
props: props, ns.Init(props, env)
env: env,
}
enabled := ns.Enabled() enabled := ns.Enabled()
assert.Equal(t, tc.ExpectedEnabled, enabled, tc.Case) assert.Equal(t, tc.ExpectedEnabled, enabled, tc.Case)

View file

@ -3,9 +3,6 @@ package segments
import ( import (
"path/filepath" "path/filepath"
"strings" "strings"
"github.com/jandedobbeleer/oh-my-posh/src/properties"
"github.com/jandedobbeleer/oh-my-posh/src/runtime"
) )
const ( const (
@ -13,8 +10,7 @@ const (
) )
type NixShell struct { type NixShell struct {
props properties.Properties base
env runtime.Environment
Type string Type string
} }
@ -53,11 +49,6 @@ func (n *NixShell) InNewNixShell() bool {
return false return false
} }
func (n *NixShell) Init(props properties.Properties, env runtime.Environment) {
n.props = props
n.env = env
}
func (n *NixShell) Enabled() bool { func (n *NixShell) Enabled() bool {
n.Type = n.DetectType() n.Type = n.DetectType()

View file

@ -6,7 +6,6 @@ import (
"github.com/jandedobbeleer/oh-my-posh/src/properties" "github.com/jandedobbeleer/oh-my-posh/src/properties"
"github.com/jandedobbeleer/oh-my-posh/src/regex" "github.com/jandedobbeleer/oh-my-posh/src/regex"
"github.com/jandedobbeleer/oh-my-posh/src/runtime"
) )
type Node struct { type Node struct {
@ -29,25 +28,19 @@ func (n *Node) Template() string {
return " {{ if .PackageManagerIcon }}{{ .PackageManagerIcon }} {{ end }}{{ .Full }} " return " {{ if .PackageManagerIcon }}{{ .PackageManagerIcon }} {{ end }}{{ .Full }} "
} }
func (n *Node) Init(props properties.Properties, env runtime.Environment) { func (n *Node) Enabled() bool {
n.language = language{ n.extensions = []string{"*.js", "*.ts", "package.json", ".nvmrc", "pnpm-workspace.yaml", ".pnpmfile.cjs", ".vue"}
env: env, n.commands = []*cmd{
props: props,
extensions: []string{"*.js", "*.ts", "package.json", ".nvmrc", "pnpm-workspace.yaml", ".pnpmfile.cjs", ".vue"},
commands: []*cmd{
{ {
executable: "node", executable: "node",
args: []string{"--version"}, args: []string{"--version"},
regex: `(?:v(?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+).(?P<patch>[0-9]+))))`, regex: `(?:v(?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+).(?P<patch>[0-9]+))))`,
}, },
},
versionURLTemplate: "https://github.com/nodejs/node/blob/master/doc/changelogs/CHANGELOG_V{{ .Major }}.md#{{ .Full }}",
matchesVersionFile: n.matchesVersionFile,
loadContext: n.loadContext,
}
} }
n.versionURLTemplate = "https://github.com/nodejs/node/blob/master/doc/changelogs/CHANGELOG_V{{ .Major }}.md#{{ .Full }}"
n.language.matchesVersionFile = n.matchesVersionFile
n.language.loadContext = n.loadContext
func (n *Node) Enabled() bool {
return n.language.Enabled() return n.language.Enabled()
} }

View file

@ -42,10 +42,11 @@ func TestNodeMatchesVersionFile(t *testing.T) {
node := &Node{ node := &Node{
language: language{ language: language{
env: env,
version: nodeVersion, version: nodeVersion,
}, },
} }
node.Init(properties.Map{}, env)
version, match := node.matchesVersionFile() version, match := node.matchesVersionFile()
assert.Equal(t, tc.Expected, match, tc.Case) assert.Equal(t, tc.Expected, match, tc.Case)
assert.Equal(t, tc.ExpectedVersion, version, tc.Case) assert.Equal(t, tc.ExpectedVersion, version, tc.Case)
@ -80,17 +81,17 @@ func TestNodeInContext(t *testing.T) {
env.On("HasFiles", "yarn.lock").Return(tc.hasYarn) env.On("HasFiles", "yarn.lock").Return(tc.hasYarn)
env.On("HasFiles", "package-lock.json").Return(tc.hasNPM) env.On("HasFiles", "package-lock.json").Return(tc.hasNPM)
env.On("HasFiles", "package.json").Return(tc.hasDefault) env.On("HasFiles", "package.json").Return(tc.hasDefault)
node := &Node{
language: language{ props := properties.Map{
env: env,
props: properties.Map{
PnpmIcon: "pnpm", PnpmIcon: "pnpm",
YarnIcon: "yarn", YarnIcon: "yarn",
NPMIcon: "npm", NPMIcon: "npm",
FetchPackageManager: tc.PkgMgrEnabled, FetchPackageManager: tc.PkgMgrEnabled,
},
},
} }
node := &Node{}
node.Init(props, env)
node.loadContext() node.loadContext()
assert.Equal(t, tc.ExpectedString, node.PackageManagerIcon, tc.Case) assert.Equal(t, tc.ExpectedString, node.PackageManagerIcon, tc.Case)
} }

View file

@ -1,34 +1,23 @@
package segments package segments
import (
"github.com/jandedobbeleer/oh-my-posh/src/properties"
"github.com/jandedobbeleer/oh-my-posh/src/runtime"
)
type Npm struct { type Npm struct {
language language
} }
func (n *Npm) Enabled() bool { func (n *Npm) Enabled() bool {
n.extensions = []string{"package.json", "package-lock.json"}
n.commands = []*cmd{
{
executable: "npm",
args: []string{"--version"},
regex: `(?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+).(?P<patch>[0-9]+)))`,
},
}
n.versionURLTemplate = "https://github.com/npm/cli/releases/tag/v{{ .Full }}"
return n.language.Enabled() return n.language.Enabled()
} }
func (n *Npm) Template() string { func (n *Npm) Template() string {
return " \ue71e {{.Full}} " return " \ue71e {{.Full}} "
} }
func (n *Npm) Init(props properties.Properties, env runtime.Environment) {
n.language = language{
env: env,
props: props,
extensions: []string{"package.json", "package-lock.json"},
commands: []*cmd{
{
executable: "npm",
args: []string{"--version"},
regex: `(?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+).(?P<patch>[0-9]+)))`,
},
},
versionURLTemplate: "https://github.com/npm/cli/releases/tag/v{{ .Full }}",
}
}

View file

@ -5,7 +5,6 @@ import (
"fmt" "fmt"
"path/filepath" "path/filepath"
"github.com/jandedobbeleer/oh-my-posh/src/properties"
"github.com/jandedobbeleer/oh-my-posh/src/runtime" "github.com/jandedobbeleer/oh-my-posh/src/runtime"
) )
@ -17,22 +16,16 @@ func (a *Nx) Template() string {
return languageTemplate return languageTemplate
} }
func (a *Nx) Init(props properties.Properties, env runtime.Environment) { func (a *Nx) Enabled() bool {
a.language = language{ a.extensions = []string{"workspace.json", "nx.json"}
env: env, a.commands = []*cmd{
props: props,
extensions: []string{"workspace.json", "nx.json"},
commands: []*cmd{
{ {
regex: `(?:(?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+).(?P<patch>[0-9]+))))`, regex: `(?:(?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+).(?P<patch>[0-9]+))))`,
getVersion: a.getVersion, getVersion: a.getVersion,
}, },
},
versionURLTemplate: "https://github.com/nrwl/nx/releases/tag/{{.Full}}",
}
} }
a.versionURLTemplate = "https://github.com/nrwl/nx/releases/tag/{{.Full}}"
func (a *Nx) Enabled() bool {
return a.language.Enabled() return a.language.Enabled()
} }

View file

@ -1,10 +1,5 @@
package segments package segments
import (
"github.com/jandedobbeleer/oh-my-posh/src/properties"
"github.com/jandedobbeleer/oh-my-posh/src/runtime"
)
type OCaml struct { type OCaml struct {
language language
} }
@ -13,21 +8,15 @@ func (o *OCaml) Template() string {
return languageTemplate return languageTemplate
} }
func (o *OCaml) Init(props properties.Properties, env runtime.Environment) { func (o *OCaml) Enabled() bool {
o.language = language{ o.extensions = []string{"*.ml", "*.mli", "dune", "dune-project", "dune-workspace"}
env: env, o.commands = []*cmd{
props: props,
extensions: []string{"*.ml", "*.mli", "dune", "dune-project", "dune-workspace"},
commands: []*cmd{
{ {
executable: "ocaml", executable: "ocaml",
args: []string{"-version"}, args: []string{"-version"},
regex: `The OCaml toplevel, version (?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+).(?P<patch>[0-9]+))(-(?P<prerelease>[a-z]+))?)`, regex: `The OCaml toplevel, version (?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+).(?P<patch>[0-9]+))(-(?P<prerelease>[a-z]+))?)`,
}, },
},
}
} }
func (o *OCaml) Enabled() bool {
return o.language.Enabled() return o.language.Enabled()
} }

View file

@ -6,8 +6,7 @@ import (
) )
type Os struct { type Os struct {
props properties.Properties base
env runtime.Environment
Icon string Icon string
} }
@ -91,8 +90,3 @@ func (oi *Os) getDistroIcon(distro string) string {
return oi.props.GetString(Linux, "\uF17C") return oi.props.GetString(Linux, "\uF17C")
} }
func (oi *Os) Init(props properties.Properties, env runtime.Environment) {
oi.props = props
oi.env = env
}

View file

@ -103,10 +103,8 @@ func TestOSInfo(t *testing.T) {
props[properties.Property(tc.Platform)] = tc.Icon props[properties.Property(tc.Platform)] = tc.Icon
} }
osInfo := &Os{ osInfo := &Os{}
env: env, osInfo.Init(props, env)
props: props,
}
_ = osInfo.Enabled() _ = osInfo.Enabled()
assert.Equal(t, tc.ExpectedString, renderTemplate(env, osInfo.Template(), osInfo), tc.Case) assert.Equal(t, tc.ExpectedString, renderTemplate(env, osInfo.Template(), osInfo), tc.Case)

View file

@ -8,12 +8,11 @@ import (
"net/url" "net/url"
"github.com/jandedobbeleer/oh-my-posh/src/properties" "github.com/jandedobbeleer/oh-my-posh/src/properties"
"github.com/jandedobbeleer/oh-my-posh/src/runtime"
) )
type Owm struct { type Owm struct {
props properties.Properties base
env runtime.Environment
Weather string Weather string
URL string URL string
units string units string
@ -167,8 +166,3 @@ func (d *Owm) setStatus() error {
} }
return nil return nil
} }
func (d *Owm) Init(props properties.Properties, env runtime.Environment) {
d.props = props
d.env = env
}

View file

@ -84,10 +84,8 @@ func TestOWMSegmentSingle(t *testing.T) {
env.On("HTTPRequest", testURL).Return([]byte(tc.WeatherJSONResponse), tc.Error) env.On("HTTPRequest", testURL).Return([]byte(tc.WeatherJSONResponse), tc.Error)
env.On("Error", testify_.Anything) env.On("Error", testify_.Anything)
o := &Owm{ o := &Owm{}
props: props, o.Init(props, env)
env: env,
}
enabled := o.Enabled() enabled := o.Enabled()
assert.Equal(t, tc.ExpectedEnabled, enabled, tc.Case) assert.Equal(t, tc.ExpectedEnabled, enabled, tc.Case)
@ -212,15 +210,15 @@ func TestOWMSegmentIcons(t *testing.T) {
env.On("HTTPRequest", testURL).Return([]byte(weatherResponse), nil) env.On("HTTPRequest", testURL).Return([]byte(weatherResponse), nil)
o := &Owm{ props := properties.Map{
props: properties.Map{
APIKey: "key", APIKey: "key",
Location: "AMSTERDAM,NL", Location: "AMSTERDAM,NL",
Units: "metric", Units: "metric",
},
env: env,
} }
o := &Owm{}
o.Init(props, env)
assert.Nil(t, o.setStatus()) assert.Nil(t, o.setStatus())
assert.Equal(t, expectedString, renderTemplate(env, o.Template(), o), tc.Case) assert.Equal(t, expectedString, renderTemplate(env, o.Template(), o), tc.Case)
} }
@ -234,15 +232,15 @@ func TestOWMSegmentIcons(t *testing.T) {
env.On("HTTPRequest", testURL).Return([]byte(weatherResponse), nil) env.On("HTTPRequest", testURL).Return([]byte(weatherResponse), nil)
o := &Owm{ props := properties.Map{
props: properties.Map{
APIKey: "key", APIKey: "key",
Location: "AMSTERDAM,NL", Location: "AMSTERDAM,NL",
Units: "metric", Units: "metric",
},
env: env,
} }
o := &Owm{}
o.Init(props, env)
assert.Nil(t, o.setStatus()) assert.Nil(t, o.setStatus())
assert.Equal(t, expectedString, renderTemplate(env, "«{{.Weather}} ({{.Temperature}}{{.UnitIcon}})»({{.URL}})", o), tc.Case) assert.Equal(t, expectedString, renderTemplate(env, "«{{.Weather}} ({{.Temperature}}{{.UnitIcon}})»({{.URL}})", o), tc.Case)
} }

View file

@ -32,8 +32,8 @@ func (f Folders) List() []string {
} }
type Path struct { type Path struct {
props properties.Properties base
env runtime.Environment
mappedLocations map[string]string mappedLocations map[string]string
root string root string
relative string relative string
@ -193,11 +193,6 @@ func (pt *Path) Parent() string {
return sb.String() return sb.String()
} }
func (pt *Path) Init(props properties.Properties, env runtime.Environment) {
pt.props = props
pt.env = env
}
func (pt *Path) setStyle() { func (pt *Path) setStyle() {
if len(pt.relative) == 0 { if len(pt.relative) == 0 {
root := pt.root root := pt.root

View file

@ -155,13 +155,14 @@ func TestParent(t *testing.T) {
env.On("Shell").Return(shell.GENERIC) env.On("Shell").Return(shell.GENERIC)
env.On("PathSeparator").Return(tc.PathSeparator) env.On("PathSeparator").Return(tc.PathSeparator)
env.On("GOOS").Return(tc.GOOS) env.On("GOOS").Return(tc.GOOS)
path := &Path{
env: env, props := properties.Map{
props: properties.Map{
FolderSeparatorIcon: tc.FolderSeparatorIcon, FolderSeparatorIcon: tc.FolderSeparatorIcon,
},
} }
path := &Path{}
path.Init(props, env)
path.setPaths() path.setPaths()
got := path.Parent() got := path.Parent()
@ -795,18 +796,18 @@ func TestAgnosterPathStyles(t *testing.T) {
env.On("RunCommand", "cygpath", testify_.Anything).Return("brrrr", nil) env.On("RunCommand", "cygpath", testify_.Anything).Return("brrrr", nil)
} }
path := &Path{ props := properties.Map{
env: env,
props: properties.Map{
FolderSeparatorIcon: tc.FolderSeparatorIcon, FolderSeparatorIcon: tc.FolderSeparatorIcon,
properties.Style: tc.Style, properties.Style: tc.Style,
MaxDepth: tc.MaxDepth, MaxDepth: tc.MaxDepth,
MaxWidth: tc.MaxWidth, MaxWidth: tc.MaxWidth,
HideRootLocation: tc.HideRootLocation, HideRootLocation: tc.HideRootLocation,
DisplayCygpath: displayCygpath, DisplayCygpath: displayCygpath,
},
} }
path := &Path{}
path.Init(props, env)
path.setPaths() path.setPaths()
path.setStyle() path.setStyle()
got := renderTemplateNoTrimSpace(env, "{{ .Path }}", path) got := renderTemplateNoTrimSpace(env, "{{ .Path }}", path)
@ -933,11 +934,12 @@ func TestFullAndFolderPath(t *testing.T) {
if tc.DisableMappedLocations { if tc.DisableMappedLocations {
props[MappedLocationsEnabled] = false props[MappedLocationsEnabled] = false
} }
path := &Path{ path := &Path{
env: env,
props: props,
StackCount: env.StackCount(), StackCount: env.StackCount(),
} }
path.Init(props, env)
path.setPaths() path.setPaths()
path.setStyle() path.setStyle()
got := renderTemplateNoTrimSpace(env, tc.Template, path) got := renderTemplateNoTrimSpace(env, tc.Template, path)
@ -992,15 +994,15 @@ func TestFullPathCustomMappedLocations(t *testing.T) {
template.Init(env) template.Init(env)
path := &Path{ props := properties.Map{
env: env,
props: properties.Map{
properties.Style: Full, properties.Style: Full,
MappedLocationsEnabled: false, MappedLocationsEnabled: false,
MappedLocations: tc.MappedLocations, MappedLocations: tc.MappedLocations,
},
} }
path := &Path{}
path.Init(props, env)
path.setPaths() path.setPaths()
path.setStyle() path.setStyle()
@ -1026,16 +1028,16 @@ func TestFolderPathCustomMappedLocations(t *testing.T) {
template.Init(env) template.Init(env)
path := &Path{ props := properties.Map{
env: env,
props: properties.Map{
properties.Style: FolderType, properties.Style: FolderType,
MappedLocations: map[string]string{ MappedLocations: map[string]string{
abcd: "#", abcd: "#",
}, },
},
} }
path := &Path{}
path.Init(props, env)
path.setPaths() path.setPaths()
path.setStyle() path.setStyle()
@ -1207,17 +1209,19 @@ func TestAgnosterPath(t *testing.T) {
} }
env.On("Flags").Return(args) env.On("Flags").Return(args)
env.On("Shell").Return(shell.PWSH) env.On("Shell").Return(shell.PWSH)
path := &Path{
env: env, props := properties.Map{
props: properties.Map{
properties.Style: Agnoster, properties.Style: Agnoster,
FolderSeparatorIcon: " > ", FolderSeparatorIcon: " > ",
FolderIcon: "f", FolderIcon: "f",
HomeIcon: "~", HomeIcon: "~",
Cycle: tc.Cycle, Cycle: tc.Cycle,
CycleFolderSeparator: tc.ColorSeparator, CycleFolderSeparator: tc.ColorSeparator,
},
} }
path := &Path{}
path.Init(props, env)
path.setPaths() path.setPaths()
path.setStyle() path.setStyle()
got := renderTemplateNoTrimSpace(env, "{{ .Path }}", path) got := renderTemplateNoTrimSpace(env, "{{ .Path }}", path)
@ -1363,15 +1367,17 @@ func TestAgnosterLeftPath(t *testing.T) {
} }
env.On("Flags").Return(args) env.On("Flags").Return(args)
env.On("Shell").Return(shell.PWSH) env.On("Shell").Return(shell.PWSH)
path := &Path{
env: env, props := properties.Map{
props: properties.Map{
properties.Style: AgnosterLeft, properties.Style: AgnosterLeft,
FolderSeparatorIcon: " > ", FolderSeparatorIcon: " > ",
FolderIcon: "f", FolderIcon: "f",
HomeIcon: "~", HomeIcon: "~",
},
} }
path := &Path{}
path.Init(props, env)
path.setPaths() path.setPaths()
path.setStyle() path.setStyle()
got := renderTemplateNoTrimSpace(env, "{{ .Path }}", path) got := renderTemplateNoTrimSpace(env, "{{ .Path }}", path)
@ -1421,16 +1427,16 @@ func TestGetPwd(t *testing.T) {
template.Init(env) template.Init(env)
path := &Path{ props := properties.Map{
env: env,
props: properties.Map{
MappedLocationsEnabled: tc.MappedLocationsEnabled, MappedLocationsEnabled: tc.MappedLocationsEnabled,
MappedLocations: map[string]string{ MappedLocations: map[string]string{
abcd: "#", abcd: "#",
}, },
},
} }
path := &Path{}
path.Init(props, env)
path.setPaths() path.setPaths()
assert.Equal(t, tc.Expected, path.pwd) assert.Equal(t, tc.Expected, path.pwd)
} }
@ -1457,14 +1463,11 @@ func TestGetFolderSeparator(t *testing.T) {
env.On("DebugF", testify_.Anything, testify_.Anything).Return(nil) env.On("DebugF", testify_.Anything, testify_.Anything).Return(nil)
env.On("Shell").Return(shell.GENERIC) env.On("Shell").Return(shell.GENERIC)
env.On("Trace", testify_.Anything, testify_.Anything).Return(nil) env.On("Trace", testify_.Anything, testify_.Anything).Return(nil)
env.On("TemplateCache").Return(&cache.Template{
Shell: "bash",
})
template.Init(env) template.Init(env)
path := &Path{
env: env,
pathSeparator: "/",
}
props := properties.Map{} props := properties.Map{}
if len(tc.FolderSeparatorTemplate) > 0 { if len(tc.FolderSeparatorTemplate) > 0 {
@ -1475,11 +1478,11 @@ func TestGetFolderSeparator(t *testing.T) {
props[FolderSeparatorIcon] = tc.FolderSeparatorIcon props[FolderSeparatorIcon] = tc.FolderSeparatorIcon
} }
env.On("TemplateCache").Return(&cache.Template{ path := &Path{
Shell: "bash", pathSeparator: "/",
}) }
path.Init(props, env)
path.props = props
got := path.getFolderSeparator() got := path.getFolderSeparator()
assert.Equal(t, tc.Expected, got) assert.Equal(t, tc.Expected, got)
} }
@ -1614,7 +1617,10 @@ func TestNormalizePath(t *testing.T) {
} }
env.On("PathSeparator").Return(tc.PathSeparator) env.On("PathSeparator").Return(tc.PathSeparator)
pt := &Path{env: env}
pt := &Path{}
pt.Init(properties.Map{}, env)
got := pt.normalize(tc.Input) got := pt.normalize(tc.Input)
assert.Equal(t, tc.Expected, got, tc.Case) assert.Equal(t, tc.Expected, got, tc.Case)
} }
@ -1650,9 +1656,7 @@ func TestReplaceMappedLocations(t *testing.T) {
template.Init(env) template.Init(env)
path := &Path{ props := properties.Map{
env: env,
props: properties.Map{
MappedLocationsEnabled: tc.MappedLocationsEnabled, MappedLocationsEnabled: tc.MappedLocationsEnabled,
MappedLocations: map[string]string{ MappedLocations: map[string]string{
abcd: "#", abcd: "#",
@ -1661,9 +1665,11 @@ func TestReplaceMappedLocations(t *testing.T) {
"~": "@", "~": "@",
"~/j/*": "", "~/j/*": "",
}, },
},
} }
path := &Path{}
path.Init(props, env)
path.setPaths() path.setPaths()
assert.Equal(t, tc.Expected, path.pwd) assert.Equal(t, tc.Expected, path.pwd)
} }
@ -1725,16 +1731,17 @@ func TestSplitPath(t *testing.T) {
env.On("HasParentFilePath", ".git", false).Return(tc.GitDir, nil) env.On("HasParentFilePath", ".git", false).Return(tc.GitDir, nil)
env.On("GOOS").Return(tc.GOOS) env.On("GOOS").Return(tc.GOOS)
path := &Path{ props := properties.Map{
env: env,
props: properties.Map{
GitDirFormat: tc.GitDirFormat, GitDirFormat: tc.GitDirFormat,
}, }
path := &Path{
root: tc.Root, root: tc.Root,
relative: tc.Relative, relative: tc.Relative,
pathSeparator: "/", pathSeparator: "/",
windowsPath: tc.GOOS == runtime.WINDOWS, windowsPath: tc.GOOS == runtime.WINDOWS,
} }
path.Init(props, env)
got := path.splitPath() got := path.splitPath()
assert.Equal(t, tc.Expected, got, tc.Case) assert.Equal(t, tc.Expected, got, tc.Case)
@ -1779,13 +1786,13 @@ func TestGetMaxWidth(t *testing.T) {
template.Init(env) template.Init(env)
path := &Path{ props := properties.Map{
env: env,
props: properties.Map{
MaxWidth: tc.MaxWidth, MaxWidth: tc.MaxWidth,
},
} }
path := &Path{}
path.Init(props, env)
got := path.getMaxWidth() got := path.getMaxWidth()
assert.Equal(t, tc.Expected, got, tc.Case) assert.Equal(t, tc.Expected, got, tc.Case)
} }

View file

@ -1,10 +1,5 @@
package segments package segments
import (
"github.com/jandedobbeleer/oh-my-posh/src/properties"
"github.com/jandedobbeleer/oh-my-posh/src/runtime"
)
type Perl struct { type Perl struct {
language language
} }
@ -13,27 +8,21 @@ func (p *Perl) Template() string {
return languageTemplate return languageTemplate
} }
func (p *Perl) Init(props properties.Properties, env runtime.Environment) { func (p *Perl) Enabled() bool {
perlRegex := `This is perl.*v(?P<version>(?P<major>[0-9]+)(?:\.(?P<minor>[0-9]+))(?:\.(?P<patch>[0-9]+))?).* built for .+` perlRegex := `This is perl.*v(?P<version>(?P<major>[0-9]+)(?:\.(?P<minor>[0-9]+))(?:\.(?P<patch>[0-9]+))?).* built for .+`
p.language = language{ p.extensions = []string{
env: env,
props: props,
extensions: []string{
".perl-version", ".perl-version",
"*.pl", "*.pl",
"*.pm", "*.pm",
"*.t", "*.t",
}, }
commands: []*cmd{ p.commands = []*cmd{
{ {
executable: "perl", executable: "perl",
args: []string{"-version"}, args: []string{"-version"},
regex: perlRegex, regex: perlRegex,
}, },
},
}
} }
func (p *Perl) Enabled() bool {
return p.language.Enabled() return p.language.Enabled()
} }

View file

@ -1,10 +1,5 @@
package segments package segments
import (
"github.com/jandedobbeleer/oh-my-posh/src/properties"
"github.com/jandedobbeleer/oh-my-posh/src/runtime"
)
type Php struct { type Php struct {
language language
} }
@ -13,22 +8,16 @@ func (p *Php) Template() string {
return languageTemplate return languageTemplate
} }
func (p *Php) Init(props properties.Properties, env runtime.Environment) { func (p *Php) Enabled() bool {
p.language = language{ p.extensions = []string{"*.php", "composer.json", "composer.lock", ".php-version", "blade.php"}
env: env, p.commands = []*cmd{
props: props,
extensions: []string{"*.php", "composer.json", "composer.lock", ".php-version", "blade.php"},
commands: []*cmd{
{ {
executable: "php", executable: "php",
args: []string{"--version"}, args: []string{"--version"},
regex: `(?:PHP (?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+).(?P<patch>[0-9]+))))`, regex: `(?:PHP (?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+).(?P<patch>[0-9]+))))`,
}, },
},
versionURLTemplate: "https://www.php.net/ChangeLog-{{ .Major }}.php#PHP_{{ .Major }}_{{ .Minor }}",
}
} }
p.versionURLTemplate = "https://www.php.net/ChangeLog-{{ .Major }}.php#PHP_{{ .Major }}_{{ .Minor }}"
func (p *Php) Enabled() bool {
return p.language.Enabled() return p.language.Enabled()
} }

View file

@ -15,12 +15,10 @@ func TestPlasticEnabledNotFound(t *testing.T) {
env.On("HasCommand", "cm").Return(false) env.On("HasCommand", "cm").Return(false)
env.On("GOOS").Return("") env.On("GOOS").Return("")
env.On("IsWsl").Return(false) env.On("IsWsl").Return(false)
p := &Plastic{
scm: scm{ p := &Plastic{}
env: env, p.Init(properties.Map{}, env)
props: properties.Map{},
},
}
assert.False(t, p.Enabled()) assert.False(t, p.Enabled())
} }
@ -36,12 +34,10 @@ func TestPlasticEnabledInWorkspaceDirectory(t *testing.T) {
IsDir: true, IsDir: true,
} }
env.On("HasParentFilePath", ".plastic", false).Return(fileInfo, nil) env.On("HasParentFilePath", ".plastic", false).Return(fileInfo, nil)
p := &Plastic{
scm: scm{ p := &Plastic{}
env: env, p.Init(properties.Map{}, env)
props: properties.Map{},
},
}
assert.True(t, p.Enabled()) assert.True(t, p.Enabled())
assert.Equal(t, fileInfo.ParentFolder, p.plasticWorkspaceFolder) assert.Equal(t, fileInfo.ParentFolder, p.plasticWorkspaceFolder)
} }
@ -50,12 +46,10 @@ func setupCmStatusEnv(status, headStatus string) *Plastic {
env := new(mock.Environment) env := new(mock.Environment)
env.On("RunCommand", "cm", []string{"status", "--all", "--machinereadable"}).Return(status, nil) env.On("RunCommand", "cm", []string{"status", "--all", "--machinereadable"}).Return(status, nil)
env.On("RunCommand", "cm", []string{"status", "--head", "--machinereadable"}).Return(headStatus, nil) env.On("RunCommand", "cm", []string{"status", "--head", "--machinereadable"}).Return(headStatus, nil)
p := &Plastic{
scm: scm{ p := &Plastic{}
env: env, p.Init(properties.Map{}, env)
props: properties.Map{},
},
}
return p return p
} }

View file

@ -1,34 +1,23 @@
package segments package segments
import (
"github.com/jandedobbeleer/oh-my-posh/src/properties"
"github.com/jandedobbeleer/oh-my-posh/src/runtime"
)
type Pnpm struct { type Pnpm struct {
language language
} }
func (n *Pnpm) Enabled() bool { func (n *Pnpm) Enabled() bool {
n.extensions = []string{"package.json", "pnpm-lock.yaml"}
n.commands = []*cmd{
{
executable: "pnpm",
args: []string{"--version"},
regex: `(?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+).(?P<patch>[0-9]+)))`,
},
}
n.versionURLTemplate = "https://github.com/pnpm/pnpm/releases/tag/v{{ .Full }}"
return n.language.Enabled() return n.language.Enabled()
} }
func (n *Pnpm) Template() string { func (n *Pnpm) Template() string {
return " \U000F02C1 {{.Full}} " return " \U000F02C1 {{.Full}} "
} }
func (n *Pnpm) Init(props properties.Properties, env runtime.Environment) {
n.language = language{
env: env,
props: props,
extensions: []string{"package.json", "pnpm-lock.yaml"},
commands: []*cmd{
{
executable: "pnpm",
args: []string{"--version"},
regex: `(?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+).(?P<patch>[0-9]+)))`,
},
},
versionURLTemplate: "https://github.com/pnpm/pnpm/releases/tag/v{{ .Full }}",
}
}

View file

@ -191,15 +191,16 @@ func TestPoshGitSegment(t *testing.T) {
env.On("RunCommand", "git", []string{"-C", "", "--no-optional-locks", "-c", "core.quotepath=false", env.On("RunCommand", "git", []string{"-C", "", "--no-optional-locks", "-c", "core.quotepath=false",
"-c", "color.status=false", "remote", "get-url", "origin"}).Return("github.com/cli", nil) "-c", "color.status=false", "remote", "get-url", "origin"}).Return("github.com/cli", nil)
props := &properties.Map{
FetchUpstreamIcon: tc.FetchUpstreamIcon,
}
g := &Git{ g := &Git{
scm: scm{ scm: scm{
env: env,
props: &properties.Map{
FetchUpstreamIcon: tc.FetchUpstreamIcon,
},
command: GITCOMMAND, command: GITCOMMAND,
}, },
} }
g.Init(props, env)
if len(tc.Template) == 0 { if len(tc.Template) == 0 {
tc.Template = g.Template() tc.Template = g.Template()
@ -236,11 +237,9 @@ func TestParsePoshGitHEAD(t *testing.T) {
} }
for _, tc := range cases { for _, tc := range cases {
g := &Git{ g := &Git{}
scm: scm{ g.Init(&properties.Map{}, new(mock.Environment))
props: &properties.Map{},
},
}
assert.Equal(t, tc.ExpectedString, g.parsePoshGitHEAD(tc.HEAD), tc.Case) assert.Equal(t, tc.ExpectedString, g.parsePoshGitHEAD(tc.HEAD), tc.Case)
} }
} }

View file

@ -9,7 +9,6 @@ import (
"github.com/jandedobbeleer/oh-my-posh/src/properties" "github.com/jandedobbeleer/oh-my-posh/src/properties"
"github.com/jandedobbeleer/oh-my-posh/src/regex" "github.com/jandedobbeleer/oh-my-posh/src/regex"
"github.com/jandedobbeleer/oh-my-posh/src/runtime"
"golang.org/x/exp/slices" "golang.org/x/exp/slices"
toml "github.com/pelletier/go-toml/v2" toml "github.com/pelletier/go-toml/v2"
@ -52,36 +51,14 @@ type NuSpec struct {
} }
type Project struct { type Project struct {
props properties.Properties base
env runtime.Environment
ProjectData ProjectData
Error string Error string
projects []*ProjectItem projects []*ProjectItem
} }
func (n *Project) Enabled() bool { func (n *Project) Enabled() bool {
for _, item := range n.projects {
if n.hasProjectFile(item) {
data := item.Fetcher(*item)
if data == nil {
continue
}
n.ProjectData = *data
n.ProjectData.Type = item.Name
return true
}
}
return n.props.GetBool(properties.AlwaysEnabled, false)
}
func (n *Project) Template() string {
return " {{ if .Error }}{{ .Error }}{{ else }}{{ if .Version }}\uf487 {{.Version}} {{ end }}{{ if .Name }}{{ .Name }} {{ end }}{{ if .Target }}\uf4de {{.Target}} {{ end }}{{ end }}" //nolint:lll
}
func (n *Project) Init(props properties.Properties, env runtime.Environment) {
n.props = props
n.env = env
n.projects = []*ProjectItem{ n.projects = []*ProjectItem{
{ {
Name: "node", Name: "node",
@ -124,6 +101,23 @@ func (n *Project) Init(props properties.Properties, env runtime.Environment) {
Fetcher: n.getPowerShellModuleData, Fetcher: n.getPowerShellModuleData,
}, },
} }
for _, item := range n.projects {
if n.hasProjectFile(item) {
data := item.Fetcher(*item)
if data == nil {
continue
}
n.ProjectData = *data
n.ProjectData.Type = item.Name
return true
}
}
return n.props.GetBool(properties.AlwaysEnabled, false)
}
func (n *Project) Template() string {
return " {{ if .Error }}{{ .Error }}{{ else }}{{ if .Version }}\uf487 {{.Version}} {{ end }}{{ if .Name }}{{ .Name }} {{ end }}{{ if .Target }}\uf4de {{.Target}} {{ end }}{{ end }}" //nolint:lll
} }
func (n *Project) hasProjectFile(p *ProjectItem) bool { func (n *Project) hasProjectFile(p *ProjectItem) bool {

View file

@ -8,7 +8,6 @@ import (
"path/filepath" "path/filepath"
"github.com/jandedobbeleer/oh-my-posh/src/properties" "github.com/jandedobbeleer/oh-my-posh/src/properties"
"github.com/jandedobbeleer/oh-my-posh/src/runtime"
"gopkg.in/yaml.v3" "gopkg.in/yaml.v3"
) )
@ -24,8 +23,7 @@ const (
) )
type Pulumi struct { type Pulumi struct {
props properties.Properties base
env runtime.Environment
Stack string Stack string
Name string Name string
@ -52,11 +50,6 @@ func (p *Pulumi) Template() string {
return "\U000f0d46 {{ .Stack }}{{if .User }} :: {{ .User }}@{{ end }}{{ if .URL }}{{ .URL }}{{ end }}" return "\U000f0d46 {{ .Stack }}{{if .User }} :: {{ .User }}@{{ end }}{{ if .URL }}{{ .URL }}{{ end }}"
} }
func (p *Pulumi) Init(props properties.Properties, env runtime.Environment) {
p.props = props
p.env = env
}
func (p *Pulumi) Enabled() bool { func (p *Pulumi) Enabled() bool {
if !p.env.HasCommand("pulumi") { if !p.env.HasCommand("pulumi") {
return false return false

View file

@ -180,14 +180,14 @@ description: A Console App
env.On("HasFilesInDir", filepath.Clean("/home/foobar/.pulumi/workspaces"), workspaceFile).Return(len(tc.WorkSpaceFile) > 0) env.On("HasFilesInDir", filepath.Clean("/home/foobar/.pulumi/workspaces"), workspaceFile).Return(len(tc.WorkSpaceFile) > 0)
env.On("FileContent", filepath.Clean("/home/foobar/.pulumi/workspaces/"+workspaceFile)).Return(tc.WorkSpaceFile, nil) env.On("FileContent", filepath.Clean("/home/foobar/.pulumi/workspaces/"+workspaceFile)).Return(tc.WorkSpaceFile, nil)
pulumi := &Pulumi{ props := properties.Map{
env: env,
props: properties.Map{
FetchStack: tc.FetchStack, FetchStack: tc.FetchStack,
FetchAbout: tc.FetchAbout, FetchAbout: tc.FetchAbout,
},
} }
pulumi := &Pulumi{}
pulumi.Init(props, env)
assert.Equal(t, tc.ExpectedEnabled, pulumi.Enabled(), tc.Case) assert.Equal(t, tc.ExpectedEnabled, pulumi.Enabled(), tc.Case)
if !tc.ExpectedEnabled { if !tc.ExpectedEnabled {

View file

@ -28,15 +28,10 @@ func (p *Python) Template() string {
return " {{ if .Error }}{{ .Error }}{{ else }}{{ if .Venv }}{{ .Venv }} {{ end }}{{ .Full }}{{ end }} " return " {{ if .Error }}{{ .Error }}{{ else }}{{ if .Venv }}{{ .Venv }} {{ end }}{{ .Full }}{{ end }} "
} }
func (p *Python) Init(props properties.Properties, env runtime.Environment) { func (p *Python) Enabled() bool {
p.language = language{ p.extensions = []string{"*.py", "*.ipynb", "pyproject.toml", "venv.bak"}
env: env, p.folders = []string{".venv", "venv", "virtualenv", "venv-win", "pyenv-win"}
props: props, p.commands = []*cmd{
extensions: []string{"*.py", "*.ipynb", "pyproject.toml", "venv.bak"},
folders: []string{".venv", "venv", "virtualenv", "venv-win", "pyenv-win"},
loadContext: p.loadContext,
inContext: p.inContext,
commands: []*cmd{
{ {
getVersion: p.pyenvVersion, getVersion: p.pyenvVersion,
regex: `(?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+).(?P<patch>[0-9]+)))`, regex: `(?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+).(?P<patch>[0-9]+)))`,
@ -56,13 +51,12 @@ func (p *Python) Init(props properties.Properties, env runtime.Environment) {
args: []string{"--version"}, args: []string{"--version"},
regex: `(?:Python (?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+).(?P<patch>[0-9]+))))`, regex: `(?:Python (?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+).(?P<patch>[0-9]+))))`,
}, },
},
versionURLTemplate: "https://docs.python.org/release/{{ .Major }}.{{ .Minor }}.{{ .Patch }}/whatsnew/changelog.html#python-{{ .Major }}-{{ .Minor }}-{{ .Patch }}",
displayMode: props.GetString(DisplayMode, DisplayModeEnvironment),
}
} }
p.versionURLTemplate = "https://docs.python.org/release/{{ .Major }}.{{ .Minor }}.{{ .Patch }}/whatsnew/changelog.html#python-{{ .Major }}-{{ .Minor }}-{{ .Patch }}"
p.displayMode = p.props.GetString(DisplayMode, DisplayModeEnvironment)
p.language.loadContext = p.loadContext
p.language.inContext = p.inContext
func (p *Python) Enabled() bool {
return p.language.Enabled() return p.language.Enabled()
} }

View file

@ -5,7 +5,6 @@ import (
"path/filepath" "path/filepath"
"github.com/jandedobbeleer/oh-my-posh/src/properties" "github.com/jandedobbeleer/oh-my-posh/src/properties"
"github.com/jandedobbeleer/oh-my-posh/src/runtime"
) )
const ( const (
@ -25,11 +24,21 @@ type Quasar struct {
} }
func (q *Quasar) Enabled() bool { func (q *Quasar) Enabled() bool {
q.projectFiles = []string{"quasar.config", "quasar.config.js"}
q.commands = []*cmd{
{
executable: "quasar",
args: []string{"--version"},
regex: `(?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+).(?P<patch>[0-9]+)))`,
},
}
q.versionURLTemplate = "https://github.com/quasarframework/quasar/releases/tag/quasar-v{{ .Full }}"
if !q.language.Enabled() { if !q.language.Enabled() {
return false return false
} }
if q.language.props.GetBool(FetchDependencies, false) { if q.props.GetBool(FetchDependencies, false) {
q.fetchDependencies() q.fetchDependencies()
} }
@ -40,22 +49,6 @@ func (q *Quasar) Template() string {
return " \uea6a {{.Full}}{{ if .HasVite }} \ueb29 {{ .Vite.Version }}{{ end }} " return " \uea6a {{.Full}}{{ if .HasVite }} \ueb29 {{ .Vite.Version }}{{ end }} "
} }
func (q *Quasar) Init(props properties.Properties, env runtime.Environment) {
q.language = language{
env: env,
props: props,
projectFiles: []string{"quasar.config", "quasar.config.js"},
commands: []*cmd{
{
executable: "quasar",
args: []string{"--version"},
regex: `(?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+).(?P<patch>[0-9]+)))`,
},
},
versionURLTemplate: "https://github.com/quasarframework/quasar/releases/tag/quasar-v{{ .Full }}",
}
}
func (q *Quasar) fetchDependencies() { func (q *Quasar) fetchDependencies() {
if !q.language.env.HasFilesInDir(q.projectRoot.ParentFolder, "package-lock.json") { if !q.language.env.HasFilesInDir(q.projectRoot.ParentFolder, "package-lock.json") {
return return

View file

@ -1,10 +1,5 @@
package segments package segments
import (
"github.com/jandedobbeleer/oh-my-posh/src/properties"
"github.com/jandedobbeleer/oh-my-posh/src/runtime"
)
type R struct { type R struct {
language language
} }
@ -13,13 +8,10 @@ func (r *R) Template() string {
return languageTemplate return languageTemplate
} }
func (r *R) Init(props properties.Properties, env runtime.Environment) { func (r *R) Enabled() bool {
rRegex := `version (?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+).(?P<patch>[0-9]+)))` rRegex := `version (?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+).(?P<patch>[0-9]+)))`
r.language = language{ r.extensions = []string{"*.R", "*.Rmd", "*.Rsx", "*.Rda", "*.Rd", "*.Rproj", ".Rproj.user"}
env: env, r.commands = []*cmd{
props: props,
extensions: []string{"*.R", "*.Rmd", "*.Rsx", "*.Rda", "*.Rd", "*.Rproj", ".Rproj.user"},
commands: []*cmd{
{ {
executable: "Rscript", executable: "Rscript",
args: []string{"--version"}, args: []string{"--version"},
@ -35,11 +27,8 @@ func (r *R) Init(props properties.Properties, env runtime.Environment) {
args: []string{"--version"}, args: []string{"--version"},
regex: rRegex, regex: rRegex,
}, },
},
versionURLTemplate: "https://www.r-project.org/",
}
} }
r.versionURLTemplate = "https://www.r-project.org/"
func (r *R) Enabled() bool {
return r.language.Enabled() return r.language.Enabled()
} }

View file

@ -1,10 +1,5 @@
package segments package segments
import (
"github.com/jandedobbeleer/oh-my-posh/src/properties"
"github.com/jandedobbeleer/oh-my-posh/src/runtime"
)
type React struct { type React struct {
language language
} }
@ -13,22 +8,16 @@ func (r *React) Template() string {
return languageTemplate return languageTemplate
} }
func (r *React) Init(props properties.Properties, env runtime.Environment) { func (r *React) Enabled() bool {
r.language = language{ r.extensions = []string{"package.json"}
env: env, r.commands = []*cmd{
props: props,
extensions: []string{"package.json"},
commands: []*cmd{
{ {
regex: `(?:(?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+).(?P<patch>[0-9]+))))`, regex: `(?:(?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+).(?P<patch>[0-9]+))))`,
getVersion: r.getVersion, getVersion: r.getVersion,
}, },
},
versionURLTemplate: "https://github.com/facebook/react/releases/tag/v{{.Full}}",
}
} }
r.versionURLTemplate = "https://github.com/facebook/react/releases/tag/v{{.Full}}"
func (r *React) Enabled() bool {
return r.language.Enabled() return r.language.Enabled()
} }

View file

@ -1,13 +1,7 @@
package segments package segments
import (
"github.com/jandedobbeleer/oh-my-posh/src/properties"
"github.com/jandedobbeleer/oh-my-posh/src/runtime"
)
type Root struct { type Root struct {
props properties.Properties base
env runtime.Environment
} }
func (rt *Root) Template() string { func (rt *Root) Template() string {
@ -17,8 +11,3 @@ func (rt *Root) Template() string {
func (rt *Root) Enabled() bool { func (rt *Root) Enabled() bool {
return rt.env.Root() return rt.env.Root()
} }
func (rt *Root) Init(props properties.Properties, env runtime.Environment) {
rt.props = props
rt.env = env
}

View file

@ -1,10 +1,5 @@
package segments package segments
import (
"github.com/jandedobbeleer/oh-my-posh/src/properties"
"github.com/jandedobbeleer/oh-my-posh/src/runtime"
)
type Ruby struct { type Ruby struct {
language language
} }
@ -13,12 +8,9 @@ func (r *Ruby) Template() string {
return languageTemplate return languageTemplate
} }
func (r *Ruby) Init(props properties.Properties, env runtime.Environment) { func (r *Ruby) Enabled() bool {
r.language = language{ r.extensions = []string{"*.rb", "Rakefile", "Gemfile"}
env: env, r.commands = []*cmd{
props: props,
extensions: []string{"*.rb", "Rakefile", "Gemfile"},
commands: []*cmd{
{ {
executable: "rbenv", executable: "rbenv",
args: []string{"version-name"}, args: []string{"version-name"},
@ -44,15 +36,14 @@ func (r *Ruby) Init(props properties.Properties, env runtime.Environment) {
args: []string{"--version"}, args: []string{"--version"},
regex: `ruby\s+(?P<version>[^\s]+)\s+`, regex: `ruby\s+(?P<version>[^\s]+)\s+`,
}, },
},
}
} }
func (r *Ruby) Enabled() bool {
enabled := r.language.Enabled() enabled := r.language.Enabled()
// this happens when no version is set // this happens when no version is set
if r.Full == "______" { if r.Full == "______" {
r.Full = "" r.Full = ""
} }
return enabled return enabled
} }

View file

@ -1,10 +1,5 @@
package segments package segments
import (
"github.com/jandedobbeleer/oh-my-posh/src/properties"
"github.com/jandedobbeleer/oh-my-posh/src/runtime"
)
type Rust struct { type Rust struct {
language language
} }
@ -13,21 +8,15 @@ func (r *Rust) Template() string {
return languageTemplate return languageTemplate
} }
func (r *Rust) Init(props properties.Properties, env runtime.Environment) { func (r *Rust) Enabled() bool {
r.language = language{ r.extensions = []string{"*.rs", "Cargo.toml", "Cargo.lock"}
env: env, r.commands = []*cmd{
props: props,
extensions: []string{"*.rs", "Cargo.toml", "Cargo.lock"},
commands: []*cmd{
{ {
executable: "rustc", executable: "rustc",
args: []string{"--version"}, args: []string{"--version"},
regex: `rustc (?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+).(?P<patch>[0-9]+))(-(?P<prerelease>[a-z]+))?)(( \((?P<buildmetadata>[0-9a-f]+ [0-9]+-[0-9]+-[0-9]+)\))?)`, regex: `rustc (?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+).(?P<patch>[0-9]+))(-(?P<prerelease>[a-z]+))?)(( \((?P<buildmetadata>[0-9a-f]+ [0-9]+-[0-9]+-[0-9]+)\))?)`,
}, },
},
}
} }
func (r *Rust) Enabled() bool {
return r.language.Enabled() return r.language.Enabled()
} }

Some files were not shown because too many files have changed in this diff Show more