Allow absolute paths in schema files. (#192)

* Allow absolute paths in schema files.

Thsi is useful for some out-of-tree testing I want to do.  It's
unfortunate (imo) that filepath.join doesn't have this behavior by
default.

Test plan:
go test ./...

* run gofmt

* one more change to use pathJoin
This commit is contained in:
Craig Silverstein
2022-05-12 14:04:04 -07:00
committed by GitHub
parent c8cbe805eb
commit 482a59b802
4 changed files with 36 additions and 6 deletions
+1
View File
@@ -30,6 +30,7 @@ When releasing a new version:
- genqlient can now run as a portable binary (i.e. without a local checkout of the repository or `go run`).
- You can now enable `use_extensions` in the configuration file, to receive extensions returned by the GraphQL API server. Generated functions will return extensions as `map[string]interface{}`, if enabled.
- You can now use `graphql.NewClientUsingGet` to create a client that uses query parameters to pass the query to the GraphQL API server.
- In config files, `schema`, `operations`, and `generated` can now be absolute paths.
### Bug fixes:
+15 -5
View File
@@ -51,6 +51,16 @@ type TypeBinding struct {
Unmarshaler string `yaml:"unmarshaler"`
}
// pathJoin is like filepath.Join but 1) it only takes two argsuments,
// and b) if the second argument is an absolute path the first argument
// is ignored (similar to how python's os.path.join() works).
func pathJoin(a, b string) string {
if filepath.IsAbs(b) {
return b
}
return filepath.Join(a, b)
}
// ValidateAndFillDefaults ensures that the configuration is valid, and fills
// in any options that were unspecified.
//
@@ -59,14 +69,14 @@ type TypeBinding struct {
func (c *Config) ValidateAndFillDefaults(baseDir string) error {
c.baseDir = baseDir
for i := range c.Schema {
c.Schema[i] = filepath.Join(baseDir, c.Schema[i])
c.Schema[i] = pathJoin(baseDir, c.Schema[i])
}
for i := range c.Operations {
c.Operations[i] = filepath.Join(baseDir, c.Operations[i])
c.Operations[i] = pathJoin(baseDir, c.Operations[i])
}
c.Generated = filepath.Join(baseDir, c.Generated)
c.Generated = pathJoin(baseDir, c.Generated)
if c.ExportOperations != "" {
c.ExportOperations = filepath.Join(baseDir, c.ExportOperations)
c.ExportOperations = pathJoin(baseDir, c.ExportOperations)
}
if c.ContextType == "" {
@@ -154,7 +164,7 @@ func findCfg() (string, error) {
func findCfgInDir(dir string) string {
for _, cfgName := range cfgFilenames {
path := filepath.Join(dir, cfgName)
path := pathJoin(dir, cfgName)
if _, err := os.Stat(path); err == nil {
return path
}
+18
View File
@@ -88,3 +88,21 @@ func TestFindCfgInDir(t *testing.T) {
})
}
}
func TestAbsoluteAndRelativePathsInConfigFiles(t *testing.T) {
cwd, err := os.Getwd()
require.NoError(t, err)
config, err := ReadAndValidateConfig(
cwd + "/testdata/find-config/current/genqlient.yaml")
require.NoError(t, err)
require.Equal(t, 1, len(config.Schema))
require.Equal(
t,
cwd+"/testdata/find-config/current/schema.graphql",
config.Schema[0],
)
require.Equal(t, 1, len(config.Operations))
require.Equal(t, "/tmp/genqlient.graphql", config.Operations[0])
}
+2 -1
View File
@@ -2,5 +2,6 @@
# https://github.com/Khan/genqlient/blob/main/docs/genqlient.yaml
schema: schema.graphql
operations:
- genqlient.graphql
# Also use this config to test absolute paths in config files.
- /tmp/genqlient.graphql
generated: generated.go