Skip to content

Commit

Permalink
impr: modular sandbox configs
Browse files Browse the repository at this point in the history
  • Loading branch information
nalgeon committed Dec 4, 2023
1 parent 07b523c commit cfe8970
Show file tree
Hide file tree
Showing 9 changed files with 113 additions and 62 deletions.
14 changes: 0 additions & 14 deletions configs/commands.json

This file was deleted.

12 changes: 12 additions & 0 deletions configs/commands/sh.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"run": {
"engine": "docker",
"entry": "main.sh",
"steps": [
{
"box": "alpine",
"command": ["sh", "main.sh"]
}
]
}
}
54 changes: 31 additions & 23 deletions internal/config/load.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,15 @@ import (
"encoding/json"
"os"
"path/filepath"
"strings"

"github.com/nalgeon/codapi/internal/fileio"
)

const (
configFilename = "config.json"
boxesFilename = "boxes.json"
commandsFilename = "commands.json"
configFilename = "config.json"
boxesFilename = "boxes.json"
commandsDirname = "commands"
)

// Read reads application config from JSON files.
Expand All @@ -24,7 +27,7 @@ func Read(path string) (*Config, error) {
return nil, err
}

cfg, err = ReadCommands(cfg, filepath.Join(path, commandsFilename))
cfg, err = ReadCommands(cfg, filepath.Join(path, commandsDirname))
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -71,31 +74,36 @@ func ReadBoxes(cfg *Config, path string) (*Config, error) {

// ReadCommands reads commands config from a JSON file.
func ReadCommands(cfg *Config, path string) (*Config, error) {
data, err := os.ReadFile(path)
if err != nil {
return nil, err
}

commands := make(map[string]SandboxCommands)
err = json.Unmarshal(data, &commands)
fnames, err := filepath.Glob(filepath.Join(path, "*.json"))
if err != nil {
return nil, err
}

for _, playCmds := range commands {
for _, cmd := range playCmds {
if cmd.Before != nil {
setStepDefaults(cmd.Before, cfg.Step)
}
for _, step := range cmd.Steps {
setStepDefaults(step, cfg.Step)
}
if cmd.After != nil {
setStepDefaults(cmd.After, cfg.Step)
}
cfg.Commands = make(map[string]SandboxCommands, len(fnames))
for _, fname := range fnames {
sandbox := strings.TrimSuffix(filepath.Base(fname), ".json")
commands, err := fileio.ReadJson[SandboxCommands](fname)
if err != nil {
break
}
setCommandDefaults(commands, cfg)
cfg.Commands[sandbox] = commands
}

cfg.Commands = commands
return cfg, err
}

// setCommandDefaults applies global defaults to sandbox commands.
func setCommandDefaults(commands SandboxCommands, cfg *Config) {
for _, cmd := range commands {
if cmd.Before != nil {
setStepDefaults(cmd.Before, cfg.Step)
}
for _, step := range cmd.Steps {
setStepDefaults(step, cfg.Step)
}
if cmd.After != nil {
setStepDefaults(cmd.After, cfg.Step)
}
}
}
25 changes: 0 additions & 25 deletions internal/config/testdata/commands.json

This file was deleted.

23 changes: 23 additions & 0 deletions internal/config/testdata/commands/python.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{
"run": {
"engine": "docker",
"entry": "main.py",
"steps": [
{
"box": "python",
"command": ["python", "main.py"]
}
]
},
"test": {
"engine": "docker",
"entry": "test_main.py",
"steps": [
{
"box": "python",
"command": ["python", "-m", "unittest"],
"noutput": 8192
}
]
}
}
15 changes: 15 additions & 0 deletions internal/fileio/fileio.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
package fileio

import (
"encoding/json"
"io"
"os"
"path/filepath"
Expand Down Expand Up @@ -37,3 +38,17 @@ func CopyFiles(pattern string, dstDir string) error {

return nil
}

// ReadJson reads the file and decodes it from JSON.
func ReadJson[T any](path string) (T, error) {
var obj T
data, err := os.ReadFile(path)
if err != nil {
return obj, err
}
err = json.Unmarshal(data, &obj)
if err != nil {
return obj, err
}
return obj, err
}
28 changes: 28 additions & 0 deletions internal/fileio/fileio_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package fileio
import (
"os"
"path/filepath"
"reflect"
"testing"
)

Expand Down Expand Up @@ -54,3 +55,30 @@ func TestCopyFiles(t *testing.T) {
t.Errorf("unexpected file content: got %q, want %q", data, expected)
}
}

func TestReadJson(t *testing.T) {
type Person struct{ Name string }

t.Run("valid", func(t *testing.T) {
got, err := ReadJson[Person](filepath.Join("testdata", "valid.json"))
if err != nil {
t.Fatalf("unexpected error %v", err)
}
want := Person{"alice"}
if !reflect.DeepEqual(got, want) {
t.Errorf("expected %v, got %v", want, got)
}
})
t.Run("invalid", func(t *testing.T) {
_, err := ReadJson[Person](filepath.Join("testdata", "invalid.json"))
if err == nil {
t.Fatal("expected error, got nil")
}
})
t.Run("does not exist", func(t *testing.T) {
_, err := ReadJson[Person](filepath.Join("testdata", "missing.json"))
if err == nil {
t.Fatal("expected error, got nil")
}
})
}
1 change: 1 addition & 0 deletions internal/fileio/testdata/invalid.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
name: alice
3 changes: 3 additions & 0 deletions internal/fileio/testdata/valid.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"name": "alice"
}

0 comments on commit cfe8970

Please sign in to comment.