Skip to content

Commit 3b51d27

Browse files
authored
Fix TODOs in SchemaValidator (#2415)
1 parent aaebd69 commit 3b51d27

File tree

4 files changed

+25
-30
lines changed

4 files changed

+25
-30
lines changed

core/src/main/scala/caliban/GraphQL.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import caliban.parsing.{ Parser, SourceMapper, VariablesCoercer }
1111
import caliban.rendering.DocumentRenderer
1212
import caliban.schema._
1313
import caliban.transformers.Transformer
14-
import caliban.validation.Validator
14+
import caliban.validation.{ SchemaValidator, Validator }
1515
import caliban.wrappers.Wrapper
1616
import caliban.wrappers.Wrapper._
1717
import zio.stacktracer.TracingImplicits.disableAutoTrace
@@ -32,7 +32,7 @@ trait GraphQL[-R] { self =>
3232
protected val transformer: Transformer[R]
3333

3434
private[caliban] def validateRootSchema: Either[ValidationError, RootSchema[R]] =
35-
Validator.validateSchema(schemaBuilder)
35+
SchemaValidator.validateSchema(schemaBuilder)
3636

3737
/**
3838
* Returns a string that renders the API types into the GraphQL SDL.

core/src/main/scala/caliban/validation/SchemaValidator.scala

+18-23
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,7 @@ import caliban.schema.{ RootSchema, RootSchemaBuilder, Types }
1010
import caliban.validation.Utils.isObjectType
1111
import caliban.validation.ValidationOps._
1212

13-
/*
14-
* TODO In the next major version:
15-
* 1. Make `SchemaValidator` an object and remove inheritance from Validator
16-
* 2. Make all methods private except `validateSchema` and `validateType`
17-
*/
18-
private[caliban] trait SchemaValidator {
13+
private[caliban] object SchemaValidator {
1914

2015
/**
2116
* Verifies that the given schema is valid. Fails with a [[caliban.CalibanError.ValidationError]] otherwise.
@@ -43,7 +38,7 @@ private[caliban] trait SchemaValidator {
4338
case _ => unit
4439
})
4540

46-
private[caliban] def validateClashingTypes(types: List[__Type]): Either[ValidationError, Unit] = {
41+
private def validateClashingTypes(types: List[__Type]): Either[ValidationError, Unit] = {
4742
val check = types.groupBy(_.name).collectFirst { case (Some(name), v) if v.size > 1 => (name, v) }
4843
check match {
4944
case None => unit
@@ -108,7 +103,7 @@ private[caliban] trait SchemaValidator {
108103
}
109104
}
110105

111-
private[caliban] def validateEnum(t: __Type): Either[ValidationError, Unit] =
106+
private def validateEnum(t: __Type): Either[ValidationError, Unit] =
112107
t.allEnumValues match {
113108
case _ :: _ => unit
114109
case Nil =>
@@ -118,7 +113,7 @@ private[caliban] trait SchemaValidator {
118113
)
119114
}
120115

121-
private[caliban] def validateUnion(t: __Type): Either[ValidationError, Unit] =
116+
private def validateUnion(t: __Type): Either[ValidationError, Unit] =
122117
t.possibleTypes match {
123118
case None | Some(Nil) =>
124119
failValidation(
@@ -134,7 +129,7 @@ private[caliban] trait SchemaValidator {
134129
case _ => unit
135130
}
136131

137-
private[caliban] def validateInputObject(t: __Type): Either[ValidationError, Unit] = {
132+
private def validateInputObject(t: __Type): Either[ValidationError, Unit] = {
138133
lazy val inputObjectContext = s"""${if (t._isOneOfInput) "OneOf " else ""}InputObject '${t.name.getOrElse("")}'"""
139134

140135
def noDuplicateInputValueName(
@@ -184,7 +179,7 @@ private[caliban] trait SchemaValidator {
184179
}
185180
}
186181

187-
private[caliban] def validateInputValue(
182+
private def validateInputValue(
188183
inputValue: __InputValue,
189184
errorContext: => String
190185
): Either[ValidationError, Unit] = {
@@ -196,7 +191,7 @@ private[caliban] trait SchemaValidator {
196191
} yield ()
197192
}
198193

199-
private[caliban] def validateInterface(t: __Type): Either[ValidationError, Unit] = {
194+
private def validateInterface(t: __Type): Either[ValidationError, Unit] = {
200195
lazy val interfaceContext = s"Interface '${t.name.getOrElse("")}'"
201196

202197
t.allFields match {
@@ -209,7 +204,7 @@ private[caliban] trait SchemaValidator {
209204
}
210205
}
211206

212-
def validateObject(obj: __Type): Either[ValidationError, Unit] = {
207+
private def validateObject(obj: __Type): Either[ValidationError, Unit] = {
213208
lazy val objectContext = s"Object '${obj.name.getOrElse("")}'"
214209

215210
def validateInterfaceFields(obj: __Type) = {
@@ -315,7 +310,7 @@ private[caliban] trait SchemaValidator {
315310
private def isListField(field: __Field) =
316311
field._type.kind == __TypeKind.LIST
317312

318-
private[caliban] def onlyInputType(`type`: __Type, errorContext: => String): Either[ValidationError, Unit] = {
313+
private def onlyInputType(`type`: __Type, errorContext: => String): Either[ValidationError, Unit] = {
319314
// https://spec.graphql.org/June2018/#IsInputType()
320315
def isInputType(t: __Type): Either[__Type, Unit] = {
321316
import __TypeKind._
@@ -336,7 +331,7 @@ private[caliban] trait SchemaValidator {
336331
}
337332
}
338333

339-
private[caliban] def validateFields(fields: List[__Field], context: => String): Either[ValidationError, Unit] =
334+
private def validateFields(fields: List[__Field], context: => String): Either[ValidationError, Unit] =
340335
noDuplicateFieldName(fields, context) *>
341336
validateAllDiscard(fields) { field =>
342337
lazy val fieldContext = s"Field '${field.name}' of $context"
@@ -347,14 +342,14 @@ private[caliban] trait SchemaValidator {
347342
} yield ()
348343
}
349344

350-
private[caliban] def noDuplicateFieldName(fields: List[__Field], errorContext: => String) = {
345+
private def noDuplicateFieldName(fields: List[__Field], errorContext: => String) = {
351346
val messageBuilder = (f: __Field) => s"$errorContext has repeated fields: ${f.name}"
352347
def explanatory =
353348
"The field must have a unique name within that Interface type; no two fields may share the same name"
354349
noDuplicateName[__Field](fields, _.name, messageBuilder, explanatory)
355350
}
356351

357-
private[caliban] def onlyOutputType(`type`: __Type, errorContext: => String): Either[ValidationError, Unit] = {
352+
private def onlyOutputType(`type`: __Type, errorContext: => String): Either[ValidationError, Unit] = {
358353
// https://spec.graphql.org/June2018/#IsOutputType()
359354
def isOutputType(t: __Type): Either[__Type, Unit] = {
360355
import __TypeKind._
@@ -375,7 +370,7 @@ private[caliban] trait SchemaValidator {
375370
}
376371
}
377372

378-
private[caliban] def noDuplicateName[T](
373+
private def noDuplicateName[T](
379374
listOfNamed: List[T],
380375
nameExtractor: T => String,
381376
messageBuilder: T => String,
@@ -388,7 +383,7 @@ private[caliban] trait SchemaValidator {
388383
failValidation(messageBuilder(duplicate), explanatoryText)
389384
)
390385

391-
private[caliban] def checkName(name: String, fieldContext: => String): Either[ValidationError, Unit] =
386+
private def checkName(name: String, fieldContext: => String): Either[ValidationError, Unit] =
392387
Parser
393388
.parseName(name)
394389
.left
@@ -399,7 +394,7 @@ private[caliban] trait SchemaValidator {
399394
)
400395
) *> doesNotStartWithUnderscore(name, fieldContext)
401396

402-
private[caliban] def doesNotStartWithUnderscore(
397+
private def doesNotStartWithUnderscore(
403398
name: String,
404399
errorContext: => String
405400
): Either[ValidationError, Unit] =
@@ -408,7 +403,7 @@ private[caliban] trait SchemaValidator {
408403
"""Names can not begin with the characters "__" (two underscores)"""
409404
)
410405

411-
private[caliban] def validateRootQuery[R](
406+
private def validateRootQuery[R](
412407
schema: RootSchemaBuilder[R]
413408
): Either[ValidationError, RootSchema[R]] =
414409
schema.query match {
@@ -427,7 +422,7 @@ private[caliban] trait SchemaValidator {
427422
)
428423
}
429424

430-
private[caliban] def validateRootMutation[R](schema: RootSchemaBuilder[R]): Either[ValidationError, Unit] =
425+
private def validateRootMutation[R](schema: RootSchemaBuilder[R]): Either[ValidationError, Unit] =
431426
schema.mutation match {
432427
case Some(mutation) if mutation.opType.kind != __TypeKind.OBJECT =>
433428
failValidation(
@@ -437,7 +432,7 @@ private[caliban] trait SchemaValidator {
437432
case _ => unit
438433
}
439434

440-
private[caliban] def validateRootSubscription[R](schema: RootSchemaBuilder[R]): Either[ValidationError, Unit] =
435+
private def validateRootSubscription[R](schema: RootSchemaBuilder[R]): Either[ValidationError, Unit] =
441436
schema.subscription match {
442437
case Some(subscription) if subscription.opType.kind != __TypeKind.OBJECT =>
443438
failValidation(

core/src/main/scala/caliban/validation/Validator.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import scala.collection.compat._
2525
import scala.collection.mutable
2626
import scala.collection.mutable.ListBuffer
2727

28-
object Validator extends SchemaValidator {
28+
object Validator {
2929
import ValidationOps._
3030
import caliban.syntax._
3131

core/src/test/scala/caliban/validation/ValidationSchemaSpec.scala

+4-4
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,15 @@ object ValidationSchemaSpec extends ZIOSpecDefault {
2121

2222
def checkTypeError(t: __Type, expectedMessage: String): IO[ValidationError, TestResult] =
2323
ZIO
24-
.fromEither(Validator.validateType(t))
24+
.fromEither(SchemaValidator.validateType(t))
2525
.exit
2626
.map(assert(_)(fails(hasField("msg", _.msg, equalTo(expectedMessage)))))
2727

2828
override def spec =
2929
suite("ValidationSchemaSpec")(
3030
suite("Enum")(
3131
test("non-empty enum is ok") {
32-
val res = Validator.validateType(
32+
val res = SchemaValidator.validateType(
3333
Types.makeEnum(
3434
name = Some("nonEmptyEnum"),
3535
description = None,
@@ -54,7 +54,7 @@ object ValidationSchemaSpec extends ZIOSpecDefault {
5454
),
5555
suite("Union")(
5656
test("union containing object types is ok") {
57-
val res = Validator.validateType(
57+
val res = SchemaValidator.validateType(
5858
Types.makeUnion(
5959
name = Some("GoodUnion"),
6060
description = None,
@@ -298,7 +298,7 @@ object ValidationSchemaSpec extends ZIOSpecDefault {
298298
graphQL(resolverFieldWithArg).interpreter.exit.map(assert(_)(succeeds(anything)))
299299
},
300300
test("fields with additional nullable args are valid") {
301-
assert(Validator.validateObject(nullableExtraArgsObject))(isRight)
301+
assert(SchemaValidator.validateType(nullableExtraArgsObject))(isRight)
302302
},
303303
test("fields with additional non-nullable args are invalid") {
304304
checkTypeError(

0 commit comments

Comments
 (0)