mirror of
https://github.com/hasura/graphql-engine.git
synced 2024-09-20 15:09:02 +03:00
cli: adds support for graphql_schema_introspection
metadata object
GitOrigin-RevId: a0c372bfa7ee0620bdd80d110da4b1e85e45f73f
This commit is contained in:
parent
ebc01c2378
commit
6d340b58c6
@ -26,6 +26,7 @@
|
||||
# export metadata and write to stdout
|
||||
$ hasura metadata export -o json
|
||||
```
|
||||
- cli: add support for `graphql_schema_introspection` metadata object
|
||||
|
||||
## v2.0.0-alpha.10
|
||||
|
||||
|
@ -0,0 +1,94 @@
|
||||
package graphqlschemaintrospection
|
||||
|
||||
import (
|
||||
"io/ioutil"
|
||||
"path/filepath"
|
||||
|
||||
"github.com/sirupsen/logrus"
|
||||
|
||||
"github.com/hasura/graphql-engine/cli"
|
||||
"gopkg.in/yaml.v2"
|
||||
)
|
||||
|
||||
const (
|
||||
MetadataFilename string = "graphql_schema_introspection.yaml"
|
||||
)
|
||||
|
||||
type MetadataObject struct {
|
||||
MetadataDir string
|
||||
|
||||
logger *logrus.Logger
|
||||
}
|
||||
|
||||
func New(ec *cli.ExecutionContext, baseDir string) *MetadataObject {
|
||||
return &MetadataObject{
|
||||
MetadataDir: baseDir,
|
||||
logger: ec.Logger,
|
||||
}
|
||||
}
|
||||
|
||||
func (o *MetadataObject) Validate() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (o *MetadataObject) CreateFiles() error {
|
||||
var v interface{}
|
||||
data, err := yaml.Marshal(v)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = ioutil.WriteFile(filepath.Join(o.MetadataDir, MetadataFilename), data, 0644)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (o *MetadataObject) Build(metadata *yaml.MapSlice) error {
|
||||
data, err := ioutil.ReadFile(filepath.Join(o.MetadataDir, MetadataFilename))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
item := yaml.MapItem{
|
||||
Key: o.Name(),
|
||||
}
|
||||
var obj yaml.MapSlice
|
||||
err = yaml.Unmarshal(data, &obj)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if len(obj) > 0 {
|
||||
item.Value = obj
|
||||
*metadata = append(*metadata, item)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (o *MetadataObject) Export(metadata yaml.MapSlice) (map[string][]byte, error) {
|
||||
var graphqlSchemaIntroSpection interface{}
|
||||
for _, item := range metadata {
|
||||
k, ok := item.Key.(string)
|
||||
if !ok || k != o.Name() {
|
||||
continue
|
||||
}
|
||||
graphqlSchemaIntroSpection = item.Value
|
||||
}
|
||||
if graphqlSchemaIntroSpection == nil {
|
||||
o.logger.WithFields(logrus.Fields{
|
||||
"object": o.Name(),
|
||||
"reason": "not found in metadata",
|
||||
}).Debugf("skipped building %s", o.Name())
|
||||
return nil, nil
|
||||
}
|
||||
data, err := yaml.Marshal(graphqlSchemaIntroSpection)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return map[string][]byte{
|
||||
filepath.Join(o.MetadataDir, MetadataFilename): data,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (o *MetadataObject) Name() string {
|
||||
return "graphql_schema_introspection"
|
||||
}
|
@ -0,0 +1,129 @@
|
||||
package graphqlschemaintrospection
|
||||
|
||||
import (
|
||||
"io/ioutil"
|
||||
"testing"
|
||||
|
||||
"github.com/google/go-cmp/cmp"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"github.com/sirupsen/logrus"
|
||||
"gopkg.in/yaml.v2"
|
||||
)
|
||||
|
||||
func TestMetadataObject_Build(t *testing.T) {
|
||||
type fields struct {
|
||||
MetadataDir string
|
||||
logger *logrus.Logger
|
||||
}
|
||||
type args struct {
|
||||
metadata *yaml.MapSlice
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
fields fields
|
||||
args args
|
||||
want string
|
||||
wantErr bool
|
||||
}{
|
||||
{
|
||||
"can build from file",
|
||||
fields{
|
||||
MetadataDir: "testdata/metadata",
|
||||
logger: logrus.New(),
|
||||
},
|
||||
args{
|
||||
metadata: new(yaml.MapSlice),
|
||||
},
|
||||
`graphql_schema_introspection:
|
||||
disabled_for_roles:
|
||||
- child
|
||||
`,
|
||||
false,
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
m := &MetadataObject{
|
||||
MetadataDir: tt.fields.MetadataDir,
|
||||
logger: tt.fields.logger,
|
||||
}
|
||||
err := m.Build(tt.args.metadata)
|
||||
if tt.wantErr {
|
||||
require.Error(t, err)
|
||||
} else {
|
||||
b, err := yaml.Marshal(tt.args.metadata)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, tt.want, string(b))
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestMetadataObject_Export(t *testing.T) {
|
||||
type fields struct {
|
||||
MetadataDir string
|
||||
logger *logrus.Logger
|
||||
}
|
||||
type args struct {
|
||||
metadata yaml.MapSlice
|
||||
}
|
||||
tests := []struct {
|
||||
name string
|
||||
fields fields
|
||||
args args
|
||||
want map[string][]byte
|
||||
wantErr bool
|
||||
}{
|
||||
{
|
||||
"can export metadata with graphql_schema_introspection",
|
||||
fields{
|
||||
MetadataDir: "testdata/metadata",
|
||||
logger: logrus.New(),
|
||||
},
|
||||
args{
|
||||
metadata: func() yaml.MapSlice {
|
||||
var metadata yaml.MapSlice
|
||||
jsonb, err := ioutil.ReadFile("testdata/metadata.json")
|
||||
assert.NoError(t, err)
|
||||
assert.NoError(t, yaml.Unmarshal(jsonb, &metadata))
|
||||
return metadata
|
||||
}(),
|
||||
},
|
||||
map[string][]byte{
|
||||
"testdata/metadata/graphql_schema_introspection.yaml": []byte(`disabled_for_roles:
|
||||
- child
|
||||
`),
|
||||
},
|
||||
false,
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
obj := &MetadataObject{
|
||||
MetadataDir: tt.fields.MetadataDir,
|
||||
logger: tt.fields.logger,
|
||||
}
|
||||
got, err := obj.Export(tt.args.metadata)
|
||||
if tt.wantErr {
|
||||
require.Error(t, err)
|
||||
} else {
|
||||
require.NoError(t, err)
|
||||
var wantContent = map[string]string{}
|
||||
var gotContent = map[string]string{}
|
||||
for k, v := range got {
|
||||
gotContent[k] = string(v)
|
||||
}
|
||||
for k, v := range tt.want {
|
||||
wantContent[k] = string(v)
|
||||
}
|
||||
assert.NoError(t, err)
|
||||
assert.NoError(t, err)
|
||||
if diff := cmp.Diff(wantContent, gotContent); diff != "" {
|
||||
t.Errorf("Export() mismatch (-want +got):\n%s", diff)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
9
cli/internal/metadataobject/graphql_schema_introspection/testdata/metadata.json
vendored
Normal file
9
cli/internal/metadataobject/graphql_schema_introspection/testdata/metadata.json
vendored
Normal file
@ -0,0 +1,9 @@
|
||||
{
|
||||
"version": 3,
|
||||
"sources": [],
|
||||
"graphql_schema_introspection": {
|
||||
"disabled_for_roles": [
|
||||
"child"
|
||||
]
|
||||
}
|
||||
}
|
@ -0,0 +1,2 @@
|
||||
disabled_for_roles:
|
||||
- child
|
@ -7,6 +7,7 @@ import (
|
||||
apilimits "github.com/hasura/graphql-engine/cli/internal/metadataobject/api_limits"
|
||||
crontriggers "github.com/hasura/graphql-engine/cli/internal/metadataobject/cron_triggers"
|
||||
"github.com/hasura/graphql-engine/cli/internal/metadataobject/functions"
|
||||
graphqlschemaintrospection "github.com/hasura/graphql-engine/cli/internal/metadataobject/graphql_schema_introspection"
|
||||
inheritedroles "github.com/hasura/graphql-engine/cli/internal/metadataobject/inherited_roles"
|
||||
"github.com/hasura/graphql-engine/cli/internal/metadataobject/querycollections"
|
||||
"github.com/hasura/graphql-engine/cli/internal/metadataobject/remoteschemas"
|
||||
@ -64,6 +65,7 @@ func GetMetadataObjectsWithDir(ec *cli.ExecutionContext, dir ...string) Objects
|
||||
|
||||
// hasura pro specific metadata objects
|
||||
objects = append(objects, apilimits.New(ec, metadataDir))
|
||||
objects = append(objects, graphqlschemaintrospection.New(ec, metadataDir))
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user