Skip to content

Commit

Permalink
Do not render emplty field list (ghostdogpr#1220)
Browse files Browse the repository at this point in the history
* Do not render emplty field list

* First round for format

* Handle empty schema as well
  • Loading branch information
Fluxx committed Jan 27, 2022
1 parent 0772b8e commit 618fc4b
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 12 deletions.
22 changes: 15 additions & 7 deletions core/src/main/scala/caliban/GraphQL.scala
Original file line number Diff line number Diff line change
Expand Up @@ -32,15 +32,23 @@ trait GraphQL[-R] { self =>
/**
* Returns a string that renders the API types into the GraphQL format.
*/
final def render: String =
s"""schema {
|${schemaBuilder.query.flatMap(_.opType.name).fold("")(n => s" query: $n\n")}${schemaBuilder.mutation
.flatMap(_.opType.name)
.fold("")(n => s" mutation: $n\n")}${schemaBuilder.subscription
.flatMap(_.opType.name)
.fold("")(n => s" subscription: $n\n")}}
final def render: String = {
val parts = Seq(
schemaBuilder.query.flatMap(_.opType.name).map(n => s" query: $n"),
schemaBuilder.mutation.flatMap(_.opType.name).map(n => s" mutation: $n"),
schemaBuilder.subscription.flatMap(_.opType.name).map(n => s" subscription: $n")
)
val schema = parts.flatten.mkString("\n") match {
case "" => ""
case something => s"""schema {
|$something
|}""".stripMargin
}

s"""$schema
|
|${renderTypes(schemaBuilder.types)}""".stripMargin
}

/**
* Converts the schema to a Document.
Expand Down
18 changes: 13 additions & 5 deletions core/src/main/scala/caliban/Rendering.scala
Original file line number Diff line number Diff line change
Expand Up @@ -62,11 +62,19 @@ object Rendering {
.enumValues(__DeprecatedArgs(Some(true)))
.fold(List.empty[String])(_.map(renderEnumValue))
.mkString("\n ")
Some(
s"""${renderDescription(t.description)}${renderKind(t.kind)} ${renderTypeName(t)}${renderInterfaces(t)}$renderedDirectives {
| $renderedFields$renderedInputFields$renderedEnumValues
|}""".stripMargin
)

val typedef =
s"${renderDescription(t.description)}${renderKind(t.kind)} ${renderTypeName(t)}${renderInterfaces(t)}$renderedDirectives"

s"$renderedFields$renderedInputFields$renderedEnumValues" match {
case "" => Some(typedef)
case interior =>
Some(
s"""$typedef {
| $interior
|}""".stripMargin
)
}
}
}
.mkString("\n\n")
Expand Down
18 changes: 18 additions & 0 deletions core/src/test/scala/caliban/RenderingSpec.scala
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,24 @@ object RenderingSpec extends DefaultRunnableSpec {
| "field-description"
| age: Int!
|}""".stripMargin.trim))
},
test("it should render empty objects without field list") {
assert(graphQL(InvalidSchemas.Object.resolverEmpty).render.trim)(
equalTo("""schema {
| query: TestEmptyObject
|}
|
|type EmptyObject
|
|type TestEmptyObject {
| o: EmptyObject!
|}""".stripMargin.trim)
)
},
test("it should not render a schema in no queries, mutations, or subscription") {
assert(graphQL(InvalidSchemas.resolverEmpty).render.trim)(
equalTo("")
)
}
)
}
1 change: 1 addition & 0 deletions core/src/test/scala/caliban/TestUtils.scala
Original file line number Diff line number Diff line change
Expand Up @@ -518,5 +518,6 @@ object TestUtils {
TestWrongFieldArgDirectiveName(_ => UIO.unit)
)

val resolverEmpty = new RootResolver(Option.empty[Unit], Option.empty[Unit], Option.empty[Unit])
}
}

0 comments on commit 618fc4b

Please sign in to comment.