Skip to content

Commit 9891086

Browse files
authored
Merge pull request starlight-go#6 from awans/datatypes2
Datatypes
2 parents a196b02 + 2abf172 commit 9891086

20 files changed

+914
-300
lines changed

go.mod

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,7 @@ require (
1212
github.com/gorilla/mux v1.7.4
1313
github.com/hashicorp/go-immutable-radix v1.2.0
1414
github.com/json-iterator/go v1.1.9
15+
github.com/starlight-go/starlight v0.0.0-20181207205707-b06f321544f3
1516
github.com/stretchr/testify v1.4.0
17+
go.starlark.net v0.0.0-20200519165436-0aa95694c768 // indirect
1618
)

go.sum

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ github.com/awans/logio v0.0.9 h1:Fyy3YNMgccHKfwaggcgGI8mO1eNwwrs4bmocte6zBcU=
44
github.com/awans/logio v0.0.9/go.mod h1:0faQuZ4AcaTOCePeYWUS07ZsutyNoIYJIuKTMAtVaoI=
55
github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY=
66
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
7+
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
8+
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
9+
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
710
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
811
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
912
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@@ -32,10 +35,15 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742 h1:Esafd1046DLD
3235
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
3336
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
3437
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
38+
github.com/starlight-go/starlight v0.0.0-20181207205707-b06f321544f3 h1:/fBh1Ot84ILt/ociFHO98wJ9LxIMA3UG8B0unUJPFpY=
39+
github.com/starlight-go/starlight v0.0.0-20181207205707-b06f321544f3/go.mod h1:pxOc2ZuBV+CNlQgzq/HJ9Z9G/eoEMHFeuGohOvva4Co=
3540
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
3641
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
3742
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
3843
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
44+
go.starlark.net v0.0.0-20200519165436-0aa95694c768 h1:p1NBjkIS2bHXntFxS9zhyFmZ9VKtazqNnsn5r7okSTo=
45+
go.starlark.net v0.0.0-20200519165436-0aa95694c768/go.mod h1:nmDLcffg48OtT/PSW0Hg7FvpRQsQh5OSqIylirxKC7o=
46+
golang.org/x/sys v0.0.0-20191002063906-3421d5a6bb1c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
3947
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
4048
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
4149
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=

internal/api/create_op.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,14 @@ type UniqueQuery struct {
3030
Val interface{}
3131
}
3232

33-
func newId(st db.Record) error {
33+
func newID(st db.Record) error {
3434
u := uuid.New()
3535
err := st.Set("id", u)
3636
return err
3737
}
3838

3939
func (op CreateOperation) Apply(tx db.RWTx) (db.Record, error) {
40-
err := newId(op.Record)
40+
err := newID(op.Record)
4141
if err != nil {
4242
return nil, err
4343
}
@@ -52,7 +52,7 @@ func (op CreateOperation) Apply(tx db.RWTx) (db.Record, error) {
5252
}
5353

5454
func (op NestedCreateOperation) ApplyNested(tx db.RWTx, parent db.Record) (err error) {
55-
err = newId(op.Record)
55+
err = newID(op.Record)
5656
if err != nil {
5757
return err
5858
}
@@ -72,12 +72,12 @@ func (op NestedCreateOperation) ApplyNested(tx db.RWTx, parent db.Record) (err e
7272
return nil
7373
}
7474

75-
func findOneById(tx db.Tx, modelName string, id uuid.UUID) (db.Record, error) {
75+
func findOneByID(tx db.Tx, modelName string, id uuid.UUID) (db.Record, error) {
7676
return tx.FindOne(modelName, db.Eq("id", id))
7777
}
7878

7979
func (op NestedConnectOperation) ApplyNested(tx db.RWTx, parent db.Record) (err error) {
80-
targetModel, err := tx.GetModelById(op.Binding.Dual().ModelId())
80+
targetModel, err := tx.GetModelByID(op.Binding.Dual().ModelID())
8181
if err != nil {
8282
return
8383
}

internal/api/create_op_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ func TestCreateApply(t *testing.T) {
118118
op.Apply(tx)
119119
}
120120
for _, findCase := range testCase.output {
121-
found, _ := findOneById(tx, findCase.modelName, findCase.st.Id())
121+
found, _ := findOneByID(tx, findCase.modelName, findCase.st.ID())
122122
if diff := deep.Equal(found, findCase.st); diff != nil {
123123
t.Error(diff)
124124
}

internal/api/include_op.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,10 @@ func (i Include) Resolve(tx db.Tx, rec db.Record) IncludeResult {
4242

4343
func resolve(tx db.Tx, ir *IncludeResult, i Inclusion) error {
4444
rec := ir.Record
45-
id := ir.Record.Id()
45+
id := ir.Record.ID()
4646
b := i.Binding
4747
d := b.Dual()
48-
targetModel, err := tx.GetModelById(d.ModelId())
48+
targetModel, err := tx.GetModelByID(d.ModelID())
4949
if err != nil {
5050
return err
5151
}

internal/api/parse.go

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ func (p Parser) parseNestedCreate(parentBinding db.Binding, data map[string]inte
4646
unusedKeys[k] = void{}
4747
}
4848

49-
targetModel, err := p.tx.GetModelById(parentBinding.Dual().ModelId())
49+
targetModel, err := p.tx.GetModelByID(parentBinding.Dual().ModelID())
5050
if err != nil {
5151
return
5252
}
@@ -76,15 +76,16 @@ func (p Parser) parseNestedConnect(parentBinding db.Binding, data map[string]int
7676
if len(data) != 1 {
7777
panic("Too many keys in a unique query")
7878
}
79-
m, err := p.tx.GetModelById(parentBinding.Dual().ModelId())
79+
m, err := p.tx.GetModelByID(parentBinding.Dual().ModelID())
8080
if err != nil {
8181
return
8282
}
8383
// this should be a separate method
8484
var uq UniqueQuery
8585
for k, v := range data {
8686
var val interface{}
87-
val, err = m.AttributeByName(k).ParseFromJson(v)
87+
d := m.AttributeByName(k).Datatype
88+
val, err = d.FromJSON(v)
8889
if err != nil {
8990
return op, fmt.Errorf("error parsing %v %v: %w", m.Name, k, err)
9091
}
@@ -206,9 +207,9 @@ func (p Parser) ParseFindOne(modelName string, data map[string]interface{}) (op
206207
}
207208

208209
for k, v := range data {
209-
attr := m.AttributeByName(k)
210-
fieldName = db.JsonKeyToFieldName(k)
211-
value, err = attr.ParseFromJson(v)
210+
fieldName = db.JSONKeyToFieldName(k)
211+
d := m.AttributeByName(k).Datatype
212+
value, err = d.FromJSON(v)
212213
if err != nil {
213214
return
214215
}
@@ -221,7 +222,7 @@ func (p Parser) ParseFindOne(modelName string, data map[string]interface{}) (op
221222
},
222223
ModelName: modelName,
223224
}
224-
return op, nil
225+
return
225226
}
226227

227228
func (p Parser) ParseFindMany(modelName string, data map[string]interface{}) (op FindManyOperation, err error) {
@@ -344,8 +345,8 @@ func parseFieldCriteria(m db.Model, data map[string]interface{}) (fieldCriteria
344345
}
345346

346347
func parseFieldCriterion(key string, a db.Attribute, value interface{}) (fc FieldCriterion, err error) {
347-
fieldName := db.JsonKeyToFieldName(key)
348-
parsedValue, err := a.ParseFromJson(value)
348+
fieldName := db.JSONKeyToFieldName(key)
349+
parsedValue, err := a.Datatype.FromJSON(value)
349350
fc = FieldCriterion{
350351
// TODO handle function values like {startsWith}
351352
Key: fieldName,
@@ -388,7 +389,7 @@ func (p Parser) parseAggregateRelationshipCriterion(b db.Binding, value interfac
388389

389390
func (p Parser) parseRelationshipCriterion(b db.Binding, value interface{}) (rc RelationshipCriterion, err error) {
390391
mapValue := value.(map[string]interface{})
391-
m, err := p.tx.GetModelById(b.Dual().ModelId())
392+
m, err := p.tx.GetModelByID(b.Dual().ModelID())
392393
if err != nil {
393394
return
394395
}

internal/api/starlark_test.go

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
package api
2+
3+
import (
4+
"awans.org/aft/internal/bus"
5+
"awans.org/aft/internal/db"
6+
"github.com/google/uuid"
7+
"github.com/gorilla/mux"
8+
"github.com/stretchr/testify/assert"
9+
"net/http"
10+
"net/http/httptest"
11+
"strings"
12+
"testing"
13+
)
14+
15+
var Andrew = db.Datatype{
16+
ID: uuid.MustParse("46c0ee11-3943-452d-9420-925dd9be8208"),
17+
Name: "andrew",
18+
Validator: AndrewValidator,
19+
StorageType: db.StringType,
20+
}
21+
22+
var AndrewValidator = db.Code{
23+
ID: uuid.MustParse("aaea187b-d153-4c4a-a7e7-cda599b02ba6"),
24+
Name: "andrewValidator",
25+
Runtime: db.Starlark,
26+
Function: db.Validator,
27+
Code: `
28+
def func(arg):
29+
if arg == "Andrew":
30+
return ""
31+
return "arg should be Andrew!!!"
32+
arg.Error = func(arg.Value)
33+
`,
34+
}
35+
36+
var UserStarlark = db.Model{
37+
ID: uuid.MustParse("887a91b8-3857-4b4d-a633-a6386a4fae25"),
38+
Name: "userStarlark",
39+
Attributes: map[string]db.Attribute{
40+
"firstName": db.Attribute{
41+
ID: uuid.MustParse("2afdc6d7-9715-41eb-80d0-20b5132efe94"),
42+
Datatype: Andrew,
43+
},
44+
"lastName": db.Attribute{
45+
ID: uuid.MustParse("462212e7-dd94-403e-8314-e271fd7ccec9"),
46+
Datatype: db.String,
47+
},
48+
"age": db.Attribute{
49+
ID: uuid.MustParse("7b0f19ab-a615-49f7-b5a6-d2054d442a76"),
50+
Datatype: db.Int,
51+
},
52+
"emailAddress": db.Attribute{
53+
ID: uuid.MustParse("0fe6bd01-9828-43ac-b004-37620083344d"),
54+
Datatype: db.EmailAddress,
55+
},
56+
},
57+
LeftRelationships: []db.Relationship{
58+
db.UserPosts,
59+
db.UserProfile,
60+
},
61+
}
62+
63+
func TestCreateAndrewType(t *testing.T) {
64+
appDB := db.New()
65+
tx := appDB.NewRWTx()
66+
r := db.RecordForModel(db.DatatypeModel)
67+
db.SaveDatatype(r, Andrew)
68+
tx.Insert(r)
69+
70+
r = db.RecordForModel(db.CodeModel)
71+
db.SaveCode(r, AndrewValidator)
72+
tx.Insert(r)
73+
tx.SaveModel(UserStarlark)
74+
tx.Commit()
75+
76+
eventbus := bus.New()
77+
db.AddSampleModels(appDB)
78+
req, err := http.NewRequest("POST", "/userStarlark.create", strings.NewReader(
79+
`{"data":{
80+
"firstName":"Chase",
81+
"lastName":"Wansley",
82+
"age": 32,
83+
"emailAddress": "andrew.wansley@gmail.com",
84+
"profile": {
85+
"create": {
86+
"text": "hello"
87+
}
88+
}
89+
},
90+
"include": {
91+
"profile": true
92+
}
93+
94+
}`))
95+
96+
req = mux.SetURLVars(req, map[string]string{"modelName": "userStarlark"})
97+
98+
cs := CreateHandler{db: appDB, bus: eventbus}
99+
w := httptest.NewRecorder()
100+
err = cs.ServeHTTP(w, req)
101+
assert.Error(t, err)
102+
}

0 commit comments

Comments
 (0)