sttp-openapi-generator icon indicating copy to clipboard operation
sttp-openapi-generator copied to clipboard

MatchError with empty Schema

Open yevgenius opened this issue 4 years ago • 4 comments

When trying to compile from openapi spec of a modified Airbyte client (original here), Hitting the below error. It seems like it's parsing some schema object without any definitions, but there aren't any in the spec file. Using version 0.2.2

[error] scala.MatchError: class Schema {
[error]     type: null
[error]     format: null
[error]     $ref: null
[error]     description: null
[error]     title: null
[error]     multipleOf: null
[error]     maximum: null
[error]     exclusiveMaximum: null
[error]     minimum: null
[error]     exclusiveMinimum: null
[error]     maxLength: null
[error]     minLength: null
[error]     pattern: null
[error]     maxItems: null
[error]     minItems: null
[error]     uniqueItems: null
[error]     maxProperties: null
[error]     minProperties: null
[error]     required: null
[error]     not: null
[error]     properties: null
[error]     additionalProperties: null
[error]     nullable: null
[error]     readOnly: null
[error]     writeOnly: null
[error]     example: null
[error]     externalDocs: null
[error]     deprecated: null
[error]     discriminator: null
[error]     xml: null
[error] } (of class io.swagger.v3.oas.models.media.Schema)
[error] 	at io.github.ghostbuster91.sttp.client3.openapi.SafeSchema$.apply(SafeOpenApi.scala:241)
[error] 	at io.github.ghostbuster91.sttp.client3.openapi.SafeArraySchema.items(SafeOpenApi.scala:174)
[error] 	at io.github.ghostbuster91.sttp.client3.ReferenceCollector.collectFromSchemaRec(ReferenceCollector.scala:58)
[error] 	at io.github.ghostbuster91.sttp.client3.ReferenceCollector.$anonfun$collectFromSchemaRec$1(ReferenceCollector.scala:52)
[error] 	at scala.collection.TraversableOnce$folder$1.apply(TraversableOnce.scala:196)
[error] 	at scala.collection.TraversableOnce$folder$1.apply(TraversableOnce.scala:194)
[error] 	at scala.collection.Iterator.foreach(Iterator.scala:943)
[error] 	at scala.collection.Iterator.foreach$(Iterator.scala:943)
[error] 	at scala.collection.AbstractIterator.foreach(Iterator.scala:1431)
[error] 	at scala.collection.MapLike$DefaultValuesIterable.foreach(MapLike.scala:214)
[error] 	at scala.collection.TraversableOnce.foldLeft(TraversableOnce.scala:199)
[error] 	at scala.collection.TraversableOnce.foldLeft$(TraversableOnce.scala:192)
[error] 	at scala.collection.AbstractTraversable.foldLeft(Traversable.scala:108)
[error] 	at io.github.ghostbuster91.sttp.client3.ReferenceCollector.collectFromSchemaRec(ReferenceCollector.scala:51)
[error] 	at io.github.ghostbuster91.sttp.client3.ReferenceCollector.$anonfun$collectFromSchemaRec$1(ReferenceCollector.scala:52)
[error] 	at scala.collection.TraversableOnce$folder$1.apply(TraversableOnce.scala:196)
[error] 	at scala.collection.TraversableOnce$folder$1.apply(TraversableOnce.scala:194)
[error] 	at scala.collection.Iterator.foreach(Iterator.scala:943)
[error] 	at scala.collection.Iterator.foreach$(Iterator.scala:943)
[error] 	at scala.collection.AbstractIterator.foreach(Iterator.scala:1431)
[error] 	at scala.collection.MapLike$DefaultValuesIterable.foreach(MapLike.scala:214)
[error] 	at scala.collection.TraversableOnce.foldLeft(TraversableOnce.scala:199)
[error] 	at scala.collection.TraversableOnce.foldLeft$(TraversableOnce.scala:192)
[error] 	at scala.collection.AbstractTraversable.foldLeft(Traversable.scala:108)
[error] 	at io.github.ghostbuster91.sttp.client3.ReferenceCollector.collectFromSchemaRec(ReferenceCollector.scala:51)
[error] 	at io.github.ghostbuster91.sttp.client3.ReferenceCollector.$anonfun$collectFromSchemaRec$1(ReferenceCollector.scala:52)
[error] 	at scala.collection.TraversableOnce$folder$1.apply(TraversableOnce.scala:196)
[error] 	at scala.collection.TraversableOnce$folder$1.apply(TraversableOnce.scala:194)
[error] 	at scala.collection.immutable.HashMap$HashMapValues.$anonfun$foreach$2(HashMap.scala:158)
[error] 	at scala.collection.immutable.HashMap$HashMap1.foreachEntry(HashMap.scala:401)
[error] 	at scala.collection.immutable.HashMap$HashTrieMap.foreachEntry(HashMap.scala:735)
[error] 	at scala.collection.immutable.HashMap$HashMapValues.foreach(HashMap.scala:158)
[error] 	at scala.collection.TraversableOnce.foldLeft(TraversableOnce.scala:199)
[error] 	at scala.collection.TraversableOnce.foldLeft$(TraversableOnce.scala:192)
[error] 	at scala.collection.AbstractTraversable.foldLeft(Traversable.scala:108)
[error] 	at io.github.ghostbuster91.sttp.client3.ReferenceCollector.collectFromSchemaRec(ReferenceCollector.scala:51)
[error] 	at io.github.ghostbuster91.sttp.client3.ReferenceCollector.collectFromSchema(ReferenceCollector.scala:37)
[error] 	at io.github.ghostbuster91.sttp.client3.ReferenceCollector.$anonfun$collectResponses$2(ReferenceCollector.scala:25)
[error] 	at scala.collection.immutable.List.flatMap(List.scala:366)
[error] 	at io.github.ghostbuster91.sttp.client3.ReferenceCollector.collectResponses(ReferenceCollector.scala:25)
[error] 	at io.github.ghostbuster91.sttp.client3.ReferenceCollector.collectSingleOperation(ReferenceCollector.scala:20)
[error] 	at io.github.ghostbuster91.sttp.client3.ReferenceCollector.$anonfun$collect$1(ReferenceCollector.scala:7)
[error] 	at scala.collection.TraversableLike.$anonfun$flatMap$1(TraversableLike.scala:293)
[error] 	at scala.collection.immutable.HashSet$HashSet1.foreach(HashSet.scala:335)
[error] 	at scala.collection.immutable.HashSet$HashTrieSet.foreach(HashSet.scala:1111)
[error] 	at scala.collection.immutable.HashSet$HashTrieSet.foreach(HashSet.scala:1111)
[error] 	at scala.collection.TraversableLike.flatMap(TraversableLike.scala:293)
[error] 	at scala.collection.TraversableLike.flatMap$(TraversableLike.scala:290)
[error] 	at scala.collection.AbstractTraversable.flatMap(Traversable.scala:108)
[error] 	at io.github.ghostbuster91.sttp.client3.ReferenceCollector.collect(ReferenceCollector.scala:7)
[error] 	at io.github.ghostbuster91.sttp.client3.Codegen.createModel(Codegen.scala:80)
[error] 	at io.github.ghostbuster91.sttp.client3.Codegen.generate(Codegen.scala:41)
[error] 	at io.github.ghostbuster91.sttp.client3.Codegen.$anonfun$generate$3(Codegen.scala:28)
[error] 	at scala.util.Either.map(Either.scala:353)
[error] 	at io.github.ghostbuster91.sttp.client3.Codegen.generate(Codegen.scala:28)
[error] 	at io.github.ghostbuster91.sttp.client3.SbtCodegenAdapter.processSingleFile(SbtCodegenAdapter.scala:30)
[error] 	at io.github.ghostbuster91.sttp.client3.SttpOpenApiCodegenPlugin$autoImport$.$anonfun$generateSources$3(SttpOpenApiCodegenPlugin.scala:57)
[error] 	at scala.collection.TraversableOnce$folder$1.apply(TraversableOnce.scala:196)
[error] 	at scala.collection.TraversableOnce$folder$1.apply(TraversableOnce.scala:194)
[error] 	at scala.collection.immutable.Set$Set1.foreach(Set.scala:141)
[error] 	at scala.collection.TraversableOnce.foldLeft(TraversableOnce.scala:199)
[error] 	at scala.collection.TraversableOnce.foldLeft$(TraversableOnce.scala:192)
[error] 	at scala.collection.AbstractTraversable.foldLeft(Traversable.scala:108)
[error] 	at io.github.ghostbuster91.sttp.client3.SttpOpenApiCodegenPlugin$autoImport$.$anonfun$generateSources$2(SttpOpenApiCodegenPlugin.scala:55)
[error] 	at sbt.util.FileFunction$.$anonfun$cached$1(FileFunction.scala:80)
[error] 	at sbt.util.FileFunction$.$anonfun$cached$4(FileFunction.scala:153)
[error] 	at sbt.util.Difference.apply(Tracked.scala:414)
[error] 	at sbt.util.Difference.apply(Tracked.scala:394)
[error] 	at sbt.util.FileFunction$.$anonfun$cached$3(FileFunction.scala:149)
[error] 	at sbt.util.Difference.apply(Tracked.scala:414)
[error] 	at sbt.util.Difference.apply(Tracked.scala:389)
[error] 	at sbt.util.FileFunction$.$anonfun$cached$2(FileFunction.scala:148)
[error] 	at io.github.ghostbuster91.sttp.client3.SttpOpenApiCodegenPlugin$autoImport$.$anonfun$generateSources$1(SttpOpenApiCodegenPlugin.scala:66)
[error] 	at scala.Function1.$anonfun$compose$1(Function1.scala:49)
[error] 	at sbt.internal.util.$tilde$greater.$anonfun$$u2219$1(TypeFunctions.scala:62)
[error] 	at sbt.std.Transform$$anon$4.work(Transform.scala:68)
[error] 	at sbt.Execute.$anonfun$submit$2(Execute.scala:282)
[error] 	at sbt.internal.util.ErrorHandling$.wideConvert(ErrorHandling.scala:23)
[error] 	at sbt.Execute.work(Execute.scala:291)
[error] 	at sbt.Execute.$anonfun$submit$1(Execute.scala:282)
[error] 	at sbt.ConcurrentRestrictions$$anon$4.$anonfun$submitValid$1(ConcurrentRestrictions.scala:265)
[error] 	at sbt.CompletionService$$anon$2.call(CompletionService.scala:64)
[error] 	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
[error] 	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
[error] 	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
[error] 	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
[error] 	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
[error] 	at java.base/java.lang.Thread.run(Thread.java:833)
[error] (airbyteClient / Compile / managedSources) scala.MatchError: class Schema {
[error]     type: null
[error]     format: null
[error]     $ref: null
[error]     description: null
[error]     title: null
[error]     multipleOf: null
[error]     maximum: null
[error]     exclusiveMaximum: null
[error]     minimum: null
[error]     exclusiveMinimum: null
[error]     maxLength: null
[error]     minLength: null
[error]     pattern: null
[error]     maxItems: null
[error]     minItems: null
[error]     uniqueItems: null
[error]     maxProperties: null
[error]     minProperties: null
[error]     required: null
[error]     not: null
[error]     properties: null
[error]     additionalProperties: null
[error]     nullable: null
[error]     readOnly: null
[error]     writeOnly: null
[error]     example: null
[error]     externalDocs: null
[error]     deprecated: null
[error]     discriminator: null
[error]     xml: null
[error] } (of class io.swagger.v3.oas.models.media.Schema)`

yevgenius avatar Oct 27 '21 02:10 yevgenius

module in build.sbt:

lazy val airbyteClient = (project in file("airbyte-client"))
  .enablePlugins(SttpOpenApiCodegenPlugin)
  .settings(commonSettings: _*)
  .settings(
    // sttpOpenApiInputPath := file(s"${baseDirectory.value.getPath}/openapi-spec.yaml"),
    // sttpOpenApiOutputPath := file(baseDirectory.value.getPath),
    libraryDependencies ++= Seq(
      "com.softwaremill.sttp.client3" %% "core" % "3.3.16",
      "com.softwaremill.sttp.client3" %% "json4s" % "3.3.16",
      "org.json4s" %% "json4s-jackson" % "3.6.8"
    ),
  )
`

yevgenius avatar Oct 27 '21 03:10 yevgenius

Hi,

Thanks for reporting. Yes, the parser is definitely something which should be improved. Thanks to such reports hopefully I will be able create more robust one. I just need to find some time...

ghostbuster91 avatar Oct 28 '21 16:10 ghostbuster91

Hi there. I got the same error with the OpenAI spec: https://github.com/openai/openai-openapi/blob/master/openapi.yaml

Is there any way to trace which part of the spec is causing this issue?

kyri-petrou avatar Jan 21 '23 01:01 kyri-petrou

Hi,

Sorry to disappoint you but for now I have been using good old binary search. Thanks for reporting. I think that I already have enough specs to start working on the better parser, but I cannot promise anything.

ghostbuster91 avatar Jan 22 '23 11:01 ghostbuster91