Skip to content

Commit

Permalink
Allow absolute paths in schema files. (#192)
Browse files Browse the repository at this point in the history
* 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
  • Loading branch information
csilvers committed May 12, 2022
1 parent c8cbe80 commit 482a59b
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 6 deletions.
1 change: 1 addition & 0 deletions docs/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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:

Expand Down
20 changes: 15 additions & 5 deletions generate/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -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.
//
Expand All @@ -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 == "" {
Expand Down Expand Up @@ -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
}
Expand Down
18 changes: 18 additions & 0 deletions generate/config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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])
}
3 changes: 2 additions & 1 deletion generate/testdata/find-config/current/genqlient.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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

0 comments on commit 482a59b

Please sign in to comment.