Skip to content

Commit 38fcc5b

Browse files
author
Jan Steinke
committed
add Julia module support
1 parent ccb0c1a commit 38fcc5b

File tree

4 files changed

+140
-0
lines changed

4 files changed

+140
-0
lines changed

config.toml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,12 @@ bottles = [
6767
"docker",
6868
]
6969

70+
[julia]
71+
modules =[
72+
"LanguageServer",
73+
"Pluto"
74+
]
75+
7076
[python]
7177
packages = [
7278
"autopep8",

internal/cmd/root.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ func initConfig() {
7979
taps := viper.GetStringSlice("homebrew.taps")
8080
vscodeExt := viper.GetStringSlice("vscode.extensions")
8181
npmPackages := viper.GetStringSlice("npm.packages")
82+
juliaModules := viper.GetStringSlice("julia.modules")
8283
var goModules []dotfiles.GoModule
8384
viper.UnmarshalKey("go.modules", &goModules)
8485
var symlinks []dotfiles.Link
@@ -99,5 +100,6 @@ func initConfig() {
99100
dotfiles.AppStore{Apps: apps, Profile: appStoreProfile, Commander: execCommander},
100101
dotfiles.SystemPreferences{Preferences: preferences, Commander: execCommander},
101102
dotfiles.Symlink{Links: symlinks, Commander: execCommander},
103+
dotfiles.Julia{Modules: juliaModules, Commander: execCommander},
102104
}
103105
}

internal/julia.go

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package dotfiles
2+
3+
import (
4+
"fmt"
5+
"strings"
6+
7+
"github.com/sirupsen/logrus"
8+
)
9+
10+
var juliaExe = "julia"
11+
12+
// NPM holds the information for all needed NPM packages.
13+
type Julia struct {
14+
Modules []string
15+
Commander Commander
16+
}
17+
18+
// GetMissingPackages returns a list of packages which are configured but not installed.
19+
func (b Julia) GetMissingPackages() ([]string, error) {
20+
missingBottles := []string{}
21+
stdout, err := b.Commander(juliaExe, "-e", "import Pkg;Pkg.status()")
22+
if err != nil {
23+
return nil, err
24+
}
25+
logrus.WithField("output", string(stdout)).Debug("julia stdout")
26+
installedFormulae := strings.Split(strings.Trim(string(stdout), "\n"), "\n")[1:]
27+
logrus.WithField("output", installedFormulae).Debug("julia installed formulae")
28+
installedMap := map[string]bool{}
29+
for _, p := range installedFormulae {
30+
logrus.WithField("output", p).Error("julia installed formulae")
31+
words := strings.Fields(p)
32+
installedMap[words[1]] = true
33+
}
34+
35+
for _, bottle := range b.Modules {
36+
if ok := installedMap[bottle]; !ok {
37+
missingBottles = append(missingBottles, bottle)
38+
}
39+
}
40+
41+
return missingBottles, nil
42+
}
43+
44+
// InstallPackages takes a list of packages for installation.
45+
func (b Julia) InstallPackages(packages []string) error {
46+
if len(packages) == 0 {
47+
logrus.Info("no julia modules to install")
48+
return nil
49+
}
50+
logrus.Info("Installing julia modules:", packages)
51+
52+
pkgCommand := fmt.Sprintf("import Pkg;Pkg.add.([\"%s\"])", strings.Join(packages[:], "\",\""))
53+
54+
_, err := b.Commander(juliaExe, "-e", pkgCommand)
55+
if err != nil {
56+
logrus.Error("Failed installing julia modules:", err)
57+
}
58+
return nil
59+
}
60+
61+
// UpdatePackages is currently not implemented.
62+
func (b Julia) UpdatePackages() error {
63+
logrus.Info("Upgrading julia modules")
64+
_, err := b.Commander(juliaExe, "-e", "import Pkg;Pkg.update()")
65+
if err != nil {
66+
logrus.Error("Failed update npm packages:", err)
67+
return err
68+
}
69+
return nil
70+
}

internal/julia_test.go

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package dotfiles
2+
3+
import (
4+
"testing"
5+
6+
"github.com/stretchr/testify/assert"
7+
)
8+
9+
func TestGetMissingJuliaModules(t *testing.T) {
10+
commander := mockCommander{}
11+
defer commander.AssertExpectations(t)
12+
commander.ExpectOutput(
13+
"julia",
14+
[]string{"-e", "import Pkg;Pkg.status()"},
15+
[]byte("Status `~/.julia/environments/v1.6/Project.toml`\n [2b0e0bc5] bar v4.1.0\n [c3e4b0f8] Pluto v0.15.1Pkg\n"),
16+
nil,
17+
)
18+
b := Julia{
19+
Modules: []string{"bar", "foo"},
20+
Commander: commander.Output,
21+
}
22+
missingPackages, err := b.GetMissingPackages()
23+
assert.NoError(t, err)
24+
assert.Equal(t, []string{"foo"}, missingPackages)
25+
}
26+
27+
func TestInstallingJuliaModules(t *testing.T) {
28+
commander := mockCommander{}
29+
defer commander.AssertExpectations(t)
30+
commander.ExpectOutput(
31+
"julia",
32+
[]string{"-e", "import Pkg;Pkg.add.([\"bar\",\"foo\"])"},
33+
nil,
34+
nil,
35+
)
36+
b := Julia{
37+
Commander: commander.Output,
38+
}
39+
err := b.InstallPackages([]string{"bar", "foo"})
40+
assert.NoError(t, err)
41+
}
42+
43+
func TestTryingToInstallJuliaModulesWithEmptyListDoesNotCallCode(t *testing.T) {
44+
commander := mockCommander{}
45+
defer commander.AssertExpectations(t)
46+
b := Julia{
47+
Commander: commander.Output,
48+
}
49+
err := b.InstallPackages([]string{})
50+
assert.NoError(t, err)
51+
}
52+
53+
func TestUpdatingJulaModules(t *testing.T) {
54+
commander := mockCommander{}
55+
defer commander.AssertExpectations(t)
56+
commander.ExpectOutput("julia", []string{"-e", "import Pkg;Pkg.update()"}, nil, nil)
57+
b := Julia{
58+
Commander: commander.Output,
59+
}
60+
err := b.UpdatePackages()
61+
assert.NoError(t, err)
62+
}

0 commit comments

Comments
 (0)