Skip to content

Commit 6c1338e

Browse files
authored
migrate(file-json-utils): from cldf to cld (#251)
migrate json file utils from cld -> cldf
1 parent 01b951b commit 6c1338e

File tree

7 files changed

+255
-2
lines changed

7 files changed

+255
-2
lines changed

.changeset/wet-days-raise.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"chainlink-deployments-framework": minor
3+
---
4+
5+
refactor: adds files and json utils from cld

engine/cld/lib/fileutils/fileutils.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package fileutils
2+
3+
import (
4+
"os"
5+
"path/filepath"
6+
)
7+
8+
// WriteFileGitKeep writes a .gitkeep file to the path.
9+
func WriteFileGitKeep(path string) error {
10+
file, err := os.Create(filepath.Join(path, ".gitkeep"))
11+
if err != nil {
12+
return err
13+
}
14+
15+
defer file.Close()
16+
17+
return nil
18+
}
19+
20+
// MkdirAllGitKeep creates a directory with a .gitkeep file. This will create all parent
21+
// directories if they do not already exist.
22+
func MkdirAllGitKeep(path string) error {
23+
if err := os.MkdirAll(path, os.ModePerm); err != nil {
24+
return err
25+
}
26+
27+
return WriteFileGitKeep(path)
28+
}
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
package fileutils
2+
3+
import (
4+
"os"
5+
"path/filepath"
6+
"testing"
7+
8+
"github.com/stretchr/testify/assert"
9+
"github.com/stretchr/testify/require"
10+
)
11+
12+
func Test_WriteFileGitKeep(t *testing.T) {
13+
t.Parallel()
14+
15+
rootDir := t.TempDir()
16+
17+
err := WriteFileGitKeep(rootDir)
18+
require.NoError(t, err)
19+
20+
_, err = os.Stat(filepath.Join(rootDir, ".gitkeep"))
21+
require.NoError(t, err)
22+
23+
err = os.MkdirAll(filepath.Join(rootDir, "subdir"), 0000)
24+
require.NoError(t, err)
25+
26+
err = WriteFileGitKeep(filepath.Join(rootDir, "subdir"))
27+
require.Error(t, err)
28+
require.ErrorContains(t, err, "permission denied")
29+
}
30+
31+
func Test_MkdirAllGitKeep(t *testing.T) {
32+
t.Parallel()
33+
34+
tests := []struct {
35+
name string
36+
beforeFunc func(t *testing.T, rootDir string)
37+
givePath string
38+
wantErr string
39+
}{
40+
{
41+
name: "success",
42+
givePath: "foo/bar",
43+
},
44+
{
45+
name: "error when permissions are denied to create dir",
46+
beforeFunc: func(t *testing.T, rootDir string) {
47+
t.Helper()
48+
49+
err := os.MkdirAll(filepath.Join(rootDir, "subdir"), 0000)
50+
require.NoError(t, err)
51+
},
52+
givePath: "subdir/foo/bar",
53+
wantErr: "permission denied",
54+
},
55+
}
56+
57+
for _, tt := range tests {
58+
t.Run(tt.name, func(t *testing.T) {
59+
t.Parallel()
60+
61+
rootDir := t.TempDir()
62+
63+
if tt.beforeFunc != nil {
64+
tt.beforeFunc(t, rootDir)
65+
}
66+
67+
err := MkdirAllGitKeep(filepath.Join(rootDir, tt.givePath))
68+
69+
if tt.wantErr != "" {
70+
require.Error(t, err)
71+
assert.ErrorContains(t, err, tt.wantErr)
72+
} else {
73+
require.NoError(t, err)
74+
75+
_, err = os.Stat(filepath.Join(rootDir, tt.givePath, ".gitkeep"))
76+
require.NoError(t, err)
77+
}
78+
})
79+
}
80+
}

engine/cld/lib/jsonutils/jsonutils.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package jsonutils
2+
3+
import (
4+
"encoding/json"
5+
"fmt"
6+
"io/fs"
7+
"os"
8+
)
9+
10+
// WriteFile marshals data into pretty JSON and writes it at path.
11+
func WriteFile(path string, data any) error {
12+
b, err := json.MarshalIndent(data, "", " ")
13+
if err != nil {
14+
return err
15+
}
16+
17+
return os.WriteFile(path, b, 0600)
18+
}
19+
20+
// LoadFromFS loads a JSON file from the filesystem, instantiates and unmarshals it into T.
21+
func LoadFromFS[T any](fs fs.ReadFileFS, path string) (T, error) {
22+
var v T
23+
24+
f, err := fs.ReadFile(path)
25+
if err != nil {
26+
return v, fmt.Errorf("failed to read %s: %w", path, err)
27+
}
28+
29+
if err = json.Unmarshal(f, &v); err != nil {
30+
return v, fmt.Errorf("failed to unmarshal JSON at path %s: %w", path, err)
31+
}
32+
33+
return v, nil
34+
}
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
package jsonutils
2+
3+
import (
4+
"os"
5+
"path/filepath"
6+
"testing"
7+
"testing/fstest"
8+
9+
"github.com/stretchr/testify/assert"
10+
"github.com/stretchr/testify/require"
11+
)
12+
13+
func Test_WriteFile(t *testing.T) {
14+
t.Parallel()
15+
16+
tests := []struct {
17+
name string
18+
givePath string
19+
giveObj any
20+
want string
21+
wantErr string
22+
}{
23+
{
24+
name: "success",
25+
givePath: "valid.json",
26+
giveObj: map[string]string{"key": "value"},
27+
want: `{"key":"value"}`,
28+
},
29+
{
30+
name: "failure: cannot marshal JSON",
31+
givePath: "invalid.json",
32+
giveObj: make(chan int),
33+
wantErr: "json: unsupported type: chan int",
34+
},
35+
}
36+
37+
for _, tt := range tests {
38+
t.Run(tt.name, func(t *testing.T) {
39+
t.Parallel()
40+
41+
rootDir := t.TempDir()
42+
43+
err := WriteFile(filepath.Join(rootDir, tt.givePath), tt.giveObj)
44+
45+
if tt.wantErr != "" {
46+
require.Error(t, err)
47+
assert.ErrorContains(t, err, tt.wantErr)
48+
} else {
49+
require.NoError(t, err)
50+
51+
b, err := os.ReadFile(filepath.Join(rootDir, tt.givePath))
52+
require.NoError(t, err)
53+
54+
assert.JSONEq(t, tt.want, string(b))
55+
}
56+
})
57+
}
58+
}
59+
60+
func Test_LoadJSON(t *testing.T) {
61+
t.Parallel()
62+
63+
fsys := fstest.MapFS{
64+
"valid.json": {Data: []byte(`{"key": "value"}`)},
65+
"invalid.json": {Data: []byte(`invalid`)},
66+
}
67+
68+
tests := []struct {
69+
name string
70+
give string
71+
want map[string]string
72+
wantErr string
73+
}{
74+
{
75+
name: "success",
76+
give: "valid.json",
77+
want: map[string]string{"key": "value"},
78+
},
79+
{
80+
name: "failure: cannot read path",
81+
give: "notfound.json",
82+
wantErr: "failed to read notfound.json",
83+
},
84+
{
85+
name: "failure: cannot unmarshal JSON",
86+
give: "invalid.json",
87+
wantErr: "failed to unmarshal JSON at path invalid.json",
88+
},
89+
}
90+
91+
for _, tt := range tests {
92+
t.Run(tt.name, func(t *testing.T) {
93+
t.Parallel()
94+
95+
got, err := LoadFromFS[map[string]string](fsys, tt.give)
96+
97+
if tt.wantErr != "" {
98+
require.Error(t, err)
99+
assert.ErrorContains(t, err, tt.wantErr)
100+
} else {
101+
require.NoError(t, err)
102+
require.Equal(t, tt.want, got)
103+
}
104+
})
105+
}
106+
}

engine/cld/nodes/nodes.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package migrations
1+
package nodes
22

33
import (
44
"encoding/json"

engine/cld/nodes/nodes_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package migrations
1+
package nodes
22

33
import (
44
"encoding/json"

0 commit comments

Comments
 (0)