Skip to content

Commit bef1616

Browse files
feat(updater): initial
1 parent e737de0 commit bef1616

File tree

5 files changed

+118
-0
lines changed

5 files changed

+118
-0
lines changed

test-fixtures/package.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"name": "test-package",
3+
"version": "1.0.0"
4+
}

update/package_json.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package update
2+
3+
import (
4+
"encoding/json"
5+
"os"
6+
)
7+
8+
func init() {
9+
Register("package.json", packageJson)
10+
}
11+
12+
func packageJson(newVersion string, file *os.File) error {
13+
var data map[string]json.RawMessage
14+
if err := json.NewDecoder(file).Decode(&data); err != nil {
15+
return err
16+
}
17+
data["version"] = json.RawMessage("\"" + newVersion + "\"")
18+
file.Seek(0, 0)
19+
file.Truncate(0)
20+
enc := json.NewEncoder(file)
21+
enc.SetIndent("", " ")
22+
if err := enc.Encode(data); err != nil {
23+
return err
24+
}
25+
return nil
26+
}

update/package_json_test.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package update
2+
3+
import (
4+
"bytes"
5+
"encoding/json"
6+
"os"
7+
"testing"
8+
)
9+
10+
func TestPackageJson(t *testing.T) {
11+
f, err := os.OpenFile("../test-fixtures/package.json", os.O_RDWR, 0)
12+
if err != nil {
13+
t.Fatal("fixture missing")
14+
}
15+
defer f.Close()
16+
nVer := "1.2.3"
17+
packageJson(nVer, f)
18+
f.Seek(0, 0)
19+
var data map[string]json.RawMessage
20+
json.NewDecoder(f).Decode(&data)
21+
if bytes.Compare(data["version"], []byte("\""+nVer+"\"")) != 0 {
22+
t.Fatal("invalid version")
23+
}
24+
}

update/update.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package update
2+
3+
import (
4+
"errors"
5+
"os"
6+
"path"
7+
"sync"
8+
)
9+
10+
type Updater func(string, *os.File) error
11+
12+
var updatersMu sync.RWMutex
13+
var updaters = make(map[string]Updater)
14+
15+
var ErrNoUpdater = errors.New("no updater registered")
16+
17+
func Register(name string, u Updater) {
18+
updatersMu.Lock()
19+
defer updatersMu.Unlock()
20+
updaters[name] = u
21+
}
22+
23+
func Apply(file, newVersion string) error {
24+
name := path.Base(file)
25+
ufn, ok := updaters[name]
26+
if !ok {
27+
return ErrNoUpdater
28+
}
29+
f, err := os.OpenFile(file, os.O_RDWR, 0)
30+
if err != nil {
31+
return err
32+
}
33+
defer f.Close()
34+
return ufn(newVersion, f)
35+
}

update/update_test.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package update
2+
3+
import (
4+
"os"
5+
"strings"
6+
"testing"
7+
)
8+
9+
func TestRegisterApply(t *testing.T) {
10+
nVer := "1.2.3"
11+
Register("package.json", func(newVersion string, file *os.File) error {
12+
if newVersion != nVer {
13+
t.Fatal("invalid version")
14+
}
15+
return nil
16+
})
17+
if err := Apply("../test-fixtures/package.json", nVer); err != nil {
18+
t.Fatal(err)
19+
}
20+
}
21+
22+
func TestApply(t *testing.T) {
23+
if err := Apply("invalidFile", ""); err != ErrNoUpdater {
24+
t.Fatal(err)
25+
}
26+
if err := Apply("not/existing/package.json", ""); !strings.Contains(err.Error(), "no such file or directory") {
27+
t.Fatal(err)
28+
}
29+
}

0 commit comments

Comments
 (0)