Commit Graph
25 Commits
Author SHA1 Message Date
Ben KraftandGitHub 1f44dc6db3 Release v0.5.0 (#208)
It feels like just yesterday, but it's been over four months since our
last release! So it's as good a time as any; while there are quite a few
changes they're individually mostly small. As usual, this updates the
changelog, and I'll tag it with the release once it lands.

Test plan: no relevant bug reports lately
2022-06-16 16:22:12 -07:00
Ben KraftandGitHub e38a212de2 Be more precise in deciding whether to add the schema prelude (#205)
GraphQL schemas have some builtin types, like `String`. The spec says
your SDL must not include those, but in practice some schemas do. (This
is probably because introspection must include them, and some tools that
create SDL from introspection don't know they're supposed to filter them
out.) Anyway, we've since #145 had logic to handle this; we just parse
with and without the prelude that defines them and see which works.

The problem is that this makes for very confusing error messages if you
have an invalid schema. (Or if you have a schema that you think is valid
but gqlparser doesn't, which is the more common case in the wild; see
for example #200.) Right now if both ways error we take the
without-prelude error, which if you didn't define the builtins is just
`undefined type String`; if we took the with-prelude error then if you
did define the builtins you'd just get `type String defined twice`. So
we actually have to be smart if we want good error messages for
everyone.

So in this commit we are smart: we check if your schema defines
`String`, and include the prelude only if it does not. To do this I
basically inlined `gqlparser.LoadSchema` (twice), so that in between
parsing and validation we can check if you have `String` and if not add
the prelude. This should in theory be both more efficient (we don't
have to do everything twice) and give better error messages,
although it's a bit more code.

Fixes #175.

Test plan: make check
2022-06-06 16:50:16 -07:00
Ben KraftandGitHub 520532eb65 Add tests to check that genqlient handles covariance (#203)
I didn't realize until today that implementations of GraphQL interfaces
are actually allowed to be covariant: if the interface has a field
`f: T`, then the implementations may have fields `f: U` where `U` is a
subtype of `T` (for example `U` may be an implementation of the
interface `T`, or `U` may be `T!` if `T` is non-nullable. (I thought it
had to be `f: T` exactly.) So I figured I'd add a test and see what
breaks.

Surprisingly, and despite the fact that Go interfaces do *not* allow
covariance, everything... worked? There's at least one place where it's
possible we could ideally use a more specific type [1], but for now I
just wanted to make sure we at least write something that builds and is
vaguely reasonable. Of course I'm not sure if there's anything I've
missed (some day I need to find a fuzzing engine that can fuzz GraphQL).

[1] Specifically, the field
`CovariantInterfaceImplementationRandomItemTopic.Next` might ideally
have type `...NextContentTopic`, not `...NextContent`; we know it's a
topic. This doesn't directly cause covariance problems in Go: the method
`GetNext` still returns `...NextContent` so the interface matches. But
that trick doesn't work for the sibling field `.Related` which is
slice-typed: or rather, we'd need the method to copy the slice to the
correct type. (Not to mention the implemention of any change here would
require a bunch of plumbing because the AST doesn't quite have what we
want.) So it's probably best to just keep this as-is for simplicity and
consistency.

Test plan: make check
2022-06-03 22:53:44 -07:00
Ben KraftandGitHub 3685f3f66b Validate against a case gqlparser doesn't catch (#197)
While writing tests at some point I came across an invalid query that
gqlparser doesn't catch, and which causes a panic for us.  Now we
validate for it and return a nice error instead of panicing.

Fixes #176.

Test plan: make check
2022-05-18 13:21:30 -07:00
Ben KraftandGitHub d4ec64fef1 Simplify errors tests a bit so they don't all have to write a schema (#196)
Some of the errors tests need to have their own schema, so the schema
can do something weird (or even be entirely invalid!).  But most can
still share a schema.  In this commit I have those indeed share a
schema, to avoid having to have a bunch of copies of mostly the same
schema.  While doing so I noticed one error whose location wasn't very
useful, and fixed it.

Test plan: make check
2022-05-15 12:20:18 -07:00
Ben KraftandGitHub 39cd158d33 Reject operation or argument names that are Go keywords (#195)
GraphQL is pretty restrictive about its identifiers, so for the most
part we can and do safely use GraphQL identifiers in the Go we generate
with attention only to conflicts with other such identifiers. But we do
need to check one thing, which is that the identifier isn't a Go
keyword. (If it is, the generated code will almost certainly fail to
compile, but often with a confusing error message.) In this commit I add
such checks.

The most likely place to run into trouble here is argument names, which
are often one word and are used as-is.  Operation names, if unexported,
can also be keywords, although in practice they're usually multiword.
Field names are always exported, thus safe.  Generated type names are
always prefixed, camel-cased, with the operation name, so they always
contain an uppercase letter (even if the operation name is lowercase),
but type-names specified by `typename` may collide, so we check those.
In theory we could check type-names specified by `bind`, but these must
be defined by the user, so their code will already fail to compile, so I
didn't bother.  I think that's all the places to consider, although it's
hard to be sure.  In summary, we check argument names, operation names,
and user-specified type names.

Test plan: make check
2022-05-12 15:00:55 -07:00
Ben KraftandGitHub c8cbe805eb Add mention of tools.go to FAQ (#189)
This came up in #160, and will surely come up again. I hope the Go
folks figure out something better here, but until such time...
2022-04-29 13:26:32 -07:00
Ben KraftandGitHub 33f4d9642e issue templates 2021-04-06 14:06:38 -07:00
Ben Kraft 53a94dfb4f add makefile 2020-01-17 18:24:18 -05:00
Ben Kraft c19f62c2c7 non-ridiculous handling of scalars 2020-01-17 18:23:29 -05:00
Ben Kraft bc2cd1a12f TODOs 2020-01-16 18:20:36 -08:00
Ben Kraft 6f56e25cc8 rewording in README 2020-01-16 18:19:17 -08:00
Ben Kraft f779b5eb58 more rearranging README 2020-01-16 18:17:40 -08:00
Ben Kraft 541e7e3357 messing with formatting in README 2020-01-16 18:15:36 -08:00
Ben Kraft 06510c2a67 more complete example in the README 2020-01-16 18:09:55 -08:00
Ben Kraft 4571dc72af add license 2020-01-16 18:03:07 -08:00
Ben Kraft 35699a73ef more README stuff, example README, other misc cleanup 2020-01-16 17:56:13 -08:00
Ben Kraft 7f6ab70ee3 wire auth to example, fix wire format, it's aliiiiiive! 2019-12-25 21:33:12 -05:00
Ben Kraft 4d880a701e move a bunch of the logic from generated into client 2019-12-25 16:26:32 -05:00
Ben Kraft 9d4b5559f4 wire up example by way of testing 2019-12-24 16:05:10 -05:00
Ben Kraft 9a157470b3 replace handwritten generated code with actual generated code 2019-12-24 15:56:01 -05:00
Ben Kraft 4a2134c533 add some TODOs 2019-12-23 23:26:51 -05:00
Ben Kraft e8b5ccbcda generates something mostly plausiblegit add . 2019-12-23 23:22:19 -05:00
Ben Kraft 7a20e2ae74 fill out the easy parts of the codegen 2019-12-23 21:07:07 -05:00
Ben Kraft efa9ccd122 add basic query struct, support 1.12 2019-12-23 19:35:38 -05:00