Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat/nim vlang segments #6057

Open
wants to merge 5 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions src/config/segment_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,8 @@ const (
NBGV SegmentType = "nbgv"
// NIGHTSCOUT is an open source diabetes system
NIGHTSCOUT SegmentType = "nightscout"
// NIM writes the active nim version
NIM SegmentType = "nim"
// NIXSHELL writes the active nix shell details
NIXSHELL SegmentType = "nix-shell"
// NODE writes which node version is currently active
Expand Down Expand Up @@ -211,6 +213,8 @@ const (
UNITY SegmentType = "unity"
// UPGRADE lets you know if you can upgrade Oh My Posh
UPGRADE SegmentType = "upgrade"
// V writes the active vlang version
V SegmentType = "v"
// VALA writes the active vala version
VALA SegmentType = "vala"
// WAKATIME writes tracked time spend in dev editors
Expand Down Expand Up @@ -283,6 +287,7 @@ var Segments = map[SegmentType]func() SegmentWriter{
NBGV: func() SegmentWriter { return &segments.Nbgv{} },
NIGHTSCOUT: func() SegmentWriter { return &segments.Nightscout{} },
NIXSHELL: func() SegmentWriter { return &segments.NixShell{} },
NIM: func() SegmentWriter { return &segments.Nim{} },
NODE: func() SegmentWriter { return &segments.Node{} },
NPM: func() SegmentWriter { return &segments.Npm{} },
NX: func() SegmentWriter { return &segments.Nx{} },
Expand Down Expand Up @@ -323,6 +328,7 @@ var Segments = map[SegmentType]func() SegmentWriter{
UMBRACO: func() SegmentWriter { return &segments.Umbraco{} },
UNITY: func() SegmentWriter { return &segments.Unity{} },
UPGRADE: func() SegmentWriter { return &segments.Upgrade{} },
V: func() SegmentWriter { return &segments.V{} },
VALA: func() SegmentWriter { return &segments.Vala{} },
WAKATIME: func() SegmentWriter { return &segments.Wakatime{} },
WINREG: func() SegmentWriter { return &segments.WindowsRegistry{} },
Expand Down
22 changes: 22 additions & 0 deletions src/segments/nim.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package segments

type Nim struct {
language
}

func (n *Nim) Template() string {
return languageTemplate
}

func (n *Nim) Enabled() bool {
n.extensions = []string{"*.nim", "*.nims"}

n.commands = []*cmd{
{
executable: "nim",
args: []string{"--version"},
regex: `Nim Compiler Version (?P<version>(?P<major>\d+)\.(?P<minor>\d+)\.(?P<patch>\d+))`,
},
}
return n.language.Enabled()
}
46 changes: 46 additions & 0 deletions src/segments/nim_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package segments

import (
"fmt"
"testing"

"github.com/stretchr/testify/assert"
)

func TestNim(t *testing.T) {
cases := []struct {
Case string
ExpectedString string
Version string
}{
{
Case: "Nim 2.2.0",
ExpectedString: "2.2.0",
Version: "Nim Compiler Version 2.2.0 [MacOSX: arm64]\nCompiled at 2024-11-30\nCopyright (c) 2006-2024 by Andreas Rumpf",
},
{
Case: "Nim 1.6.12",
ExpectedString: "1.6.12",
Version: "Nim Compiler Version 1.6.12 [Linux: amd64]\nCompiled at 2023-06-15\nCopyright (c) 2006-2023 by Andreas Rumpf",
},
{
Case: "Nim 2.0.0",
ExpectedString: "2.0.0",
Version: "Nim Compiler Version 2.0.0 [Windows: amd64]\nCompiled at 2023-12-25\nCopyright (c) 2006-2023 by Andreas Rumpf",
},
}

for _, tc := range cases {
params := &mockedLanguageParams{
cmd: "nim",
versionParam: "--version",
versionOutput: tc.Version,
extension: "*.nim",
}
env, props := getMockedLanguageEnv(params)
n := &Nim{}
n.Init(props, env)
assert.True(t, n.Enabled(), fmt.Sprintf("Failed in case: %s", tc.Case))
assert.Equal(t, tc.ExpectedString, renderTemplate(env, n.Template(), n), fmt.Sprintf("Failed in case: %s", tc.Case))
}
}
22 changes: 22 additions & 0 deletions src/segments/v.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package segments

type V struct {
language
}

func (v *V) Template() string {
return languageTemplate
}

func (v *V) Enabled() bool {
v.extensions = []string{"*.v"}

v.commands = []*cmd{
{
executable: "v",
args: []string{"--version"},
regex: `V (?P<version>(?P<major>\d+)\.(?P<minor>\d+)\.(?P<patch>\d+)) [a-f0-9]+`,
},
}
return v.language.Enabled()
}
46 changes: 46 additions & 0 deletions src/segments/v_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package segments

import (
"fmt"
"testing"

"github.com/stretchr/testify/assert"
)

func TestV(t *testing.T) {
cases := []struct {
Case string
ExpectedString string
Version string
}{
{
Case: "V 0.4.9",
ExpectedString: "0.4.9",
Version: "V 0.4.9 b487986",
},
{
Case: "V 0.4.8",
ExpectedString: "0.4.8",
Version: "V 0.4.8 a123456",
},
{
Case: "V 0.4.7",
ExpectedString: "0.4.7",
Version: "V 0.4.7 f789012",
},
}

for _, tc := range cases {
params := &mockedLanguageParams{
cmd: "v",
versionParam: "--version",
versionOutput: tc.Version,
extension: "*.v",
}
env, props := getMockedLanguageEnv(params)
v := &V{}
v.Init(props, env)
assert.True(t, v.Enabled(), fmt.Sprintf("Failed in case: %s", tc.Case))
assert.Equal(t, tc.ExpectedString, renderTemplate(env, v.Template(), v), fmt.Sprintf("Failed in case: %s", tc.Case))
}
}
104 changes: 104 additions & 0 deletions themes/schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -357,6 +357,7 @@
"mvn",
"nbgv",
"nightscout",
"nim",
"nix-shell",
"node",
"npm",
Expand Down Expand Up @@ -398,6 +399,7 @@
"umbraco",
"unity",
"upgrade",
"v",
"vala",
"wakatime",
"winreg",
Expand Down Expand Up @@ -4164,6 +4166,58 @@
}
}
},
{
"if": {
"properties": {
"type": {
"const": "v"
}
}
},
"then": {
"title": "V Segment",
"description": "https://ohmyposh.dev/docs/segments/languages/v",
"properties": {
"properties": {
"properties": {
"home_enabled": {
"$ref": "#/definitions/home_enabled"
},
"fetch_version": {
"$ref": "#/definitions/fetch_version"
},
"cache_duration": {
"$ref": "#/definitions/cache_duration",
"default": "none"
},
"display_mode": {
"$ref": "#/definitions/display_mode"
},
"missing_command_text": {
"$ref": "#/definitions/missing_command_text"
},
"version_url_template": {
"$ref": "#/definitions/version_url_template"
},
"extensions": {
"type": "array",
"title": "Extensions",
"description": "The extensions to look for when determining if the current directory is a V project",
"default": [
"*.v"
],
"items": {
"type": "string"
}
},
"folders": {
"$ref": "#/definitions/folders"
}
}
}
}
}
},
{
"if": {
"properties": {
Expand Down Expand Up @@ -4739,6 +4793,56 @@
}
}
},
{
"if": {
"properties": {
"type": {
"const": "nim"
}
}
},
"then": {
"title": "Nim Segment",
"description": "https://ohmyposh.dev/docs/segments/languages/nim",
"properties": {
"properties": {
"properties": {
"home_enabled": {
"$ref": "#/definitions/home_enabled"
},
"fetch_version": {
"$ref": "#/definitions/fetch_version"
},
"cache_duration": {
"$ref": "#/definitions/cache_duration",
"default": "none"
},
"display_mode": {
"$ref": "#/definitions/display_mode"
},
"missing_command_text": {
"$ref": "#/definitions/missing_command_text"
},
"version_url_template": {
"$ref": "#/definitions/version_url_template"
},
"extensions": {
"type": "array",
"title": "Extensions",
"description": "The extensions to look for when determining if a folder is a Nim workspace",
"default": [
"*.nim",
"*.nims"
]
},
"folders": {
"$ref": "#/definitions/folders"
}
}
}
}
}
},
{
"if": {
"properties": {
Expand Down
61 changes: 61 additions & 0 deletions website/docs/segments/languages/nim.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
---
id: nim
title: Nim
sidebar_label: Nim
---

## What

Display the currently active Nim version.

## Sample Configuration

import Config from "@site/src/components/Config.js";

<Config
data={{
type: "nim",
style: "powerline",
powerline_symbol: "\uE0B0",
foreground: "#193549",
background: "#f3d400",
template: " \ue841 {{ .Full }} ",
}}
/>

## Properties

| Name | Type | Default | Description |
| ---------------------- | :--------: | :---------------------------------: | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `home_enabled` | `boolean` | `false` | display the segment in the HOME folder or not |
| `fetch_version` | `boolean` | `true` | fetch the Nim version (`nim --version`) |
| `cache_duration` | `string` | `none` | the duration for which the version will be cached. The duration is a string in the format `1h2m3s` and is parsed using the [time.ParseDuration] function from the Go standard library. To disable the cache, use `none` |
| `missing_command_text` | `string` | | text to display when the command is missing |
| `display_mode` | `string` | `context` | <ul><li>`always`: the segment is always displayed</li><li>`files`: the segment is only displayed when file `extensions` listed are present</li><li>`context`: displays the segment when the environment or files is active</li></ul> |
| `version_url_template` | `string` | | a go [text/template][go-text-template] [template][templates] that creates the URL of the version info / release notes |
| `extensions` | `[]string` | `*.nim, *.nims` | allows to override the default list of file extensions to validate |
| `folders` | `[]string` | | allows to override the list of folder names to validate |

## Template ([info][templates])

:::note default template

```template
{{ if .Error }}{{ .Error }}{{ else }}{{ .Full }}{{ end }}
```

:::

### Properties

| Name | Type | Description |
| ------------- | -------- | -------------------------------------------------- |
| `.Full` | `string` | the full version |
| `.Major` | `string` | major number |
| `.Minor` | `string` | minor number |
| `.Patch` | `string` | patch number |
| `.Error` | `string` | error encountered when fetching the version string |

[go-text-template]: https://golang.org/pkg/text/template/
[templates]: /docs/configuration/templates
[time.ParseDuration]: https://golang.org/pkg/time/#ParseDuration
Loading
Loading