From e738d9dc537447c9bc2cbfe822cdf78dee5b6056 Mon Sep 17 00:00:00 2001 From: Jack Lynch Date: Fri, 10 Jan 2025 14:59:52 +0000 Subject: [PATCH 1/2] FDN-3181 Publish scala2 version --- .apibuilder/.tracked_files | 4 +- .apibuilder/config | 3 +- build.sbt | 28 +- .../ApicollectiveApibuilderSpecV0Models.scala | 1426 +++++++++++++++++ .../ApicollectiveApibuilderSpecV0Models.scala | 18 +- .../io/apibuilder/ApiBuilderHelper.scala | 4 +- .../validation/ApiBuilderService.scala | 4 +- .../validation/DynamicRouteMap.scala | 6 +- .../apibuilder/validation/MultiService.scala | 4 +- .../validation/PathNormalizer.scala | 2 +- .../util/UnionToModelBuilderSpec.scala | 2 +- .../validation/JsonValidatorSpec.scala | 2 +- .../validation/MultiServiceImplSpec.scala | 2 +- .../validation/MultiServiceSpec.scala | 2 +- .../validation/MultiServiceZipSpec.scala | 6 +- .../ServiceOperationResolverSpec.scala | 4 +- .../io/apibuilder/validation/Validator.scala | 2 +- .../validation/util/UrlDownloaderSpec.scala | 2 +- .../util/ValidatedUrlDownloaderSpec.scala | 2 +- 19 files changed, 1491 insertions(+), 32 deletions(-) create mode 100644 src/main/scala-2.13/io/apibuilder/generated/ApicollectiveApibuilderSpecV0Models.scala rename src/main/{scala => scala-3}/io/apibuilder/generated/ApicollectiveApibuilderSpecV0Models.scala (98%) diff --git a/.apibuilder/.tracked_files b/.apibuilder/.tracked_files index 5bce596..35dc2f8 100644 --- a/.apibuilder/.tracked_files +++ b/.apibuilder/.tracked_files @@ -1,5 +1,7 @@ --- apicollective: apibuilder-spec: + play_2_x_scala_3_standalone_json: + - src/main/scala-3/io/apibuilder/generated/ApicollectiveApibuilderSpecV0Models.scala play_2_x_standalone_json: - - src/main/scala/io/apibuilder/generated/ApicollectiveApibuilderSpecV0Models.scala + - src/main/scala-2.13/io/apibuilder/generated/ApicollectiveApibuilderSpecV0Models.scala diff --git a/.apibuilder/config b/.apibuilder/config index b33f023..15a3a2f 100644 --- a/.apibuilder/config +++ b/.apibuilder/config @@ -3,4 +3,5 @@ code: apibuilder-spec: version: latest generators: - play_2_x_scala_3_standalone_json: src/main/scala/io/apibuilder/generated + play_2_x_standalone_json: src/main/scala-2.13/io/apibuilder/generated + play_2_x_scala_3_standalone_json: src/main/scala-3/io/apibuilder/generated diff --git a/build.sbt b/build.sbt index 57d803a..1db2126 100644 --- a/build.sbt +++ b/build.sbt @@ -1,16 +1,23 @@ +lazy val scala2 = "2.13.15" +lazy val scala3 = "3.4.2" +lazy val supportedScalaVersions = List(scala2, scala3) + name := "apibuilder-validation" organization := "io.apibuilder" -ThisBuild / scalaVersion := "3.4.2" +ThisBuild / scalaVersion := scala3 lazy val allScalacOptions = Seq( "-feature", "-Xfatal-warnings", + "-Wconf:src=generated/.*:silent", + "-deprecation" ) lazy val resolversSettings = Seq( - resolvers += "jitpack" at "https://jitpack.io" +// resolvers += "jitpack" at "https://jitpack.io", + resolvers += "Artifactory" at "https://flow.jfrog.io/flow/libs-release/", ) lazy val root = project @@ -19,13 +26,24 @@ lazy val root = project .settings( testOptions += Tests.Argument("-oF"), libraryDependencies ++= Seq( - "com.github.apicollective" % "apibuilder-commons" % "0.1.0", - "com.typesafe.play" %% "play-json" % "2.10.6", - "com.typesafe.play" %% "play-json-joda" % "2.10.6", + "io.apibuilder" %% "apibuilder-commons" % "0.1.3", + "com.typesafe.play" %% "play-json" % (if (scalaVersion.value.startsWith("3")) "2.10.6" else "2.9.4"), + "com.typesafe.play" %% "play-json-joda" % (if (scalaVersion.value.startsWith("3")) "2.10.6" else "2.9.4"), "org.apache.commons" % "commons-compress" % "1.26.2", "org.typelevel" %% "cats-core" % "2.12.0", "org.scalatest" %% "scalatest" % "3.2.19" % Test, ), scalacOptions ++= allScalacOptions, + crossScalaVersions := supportedScalaVersions, ) + +publishTo := { + val host = "https://flow.jfrog.io/flow" + if (isSnapshot.value) { + Some("Artifactory Realm" at s"$host/libs-snapshot-local;build.timestamp=" + new java.util.Date().getTime) + } else { + Some("Artifactory Realm" at s"$host/libs-release-local") + } +} + version := "0.5.2" diff --git a/src/main/scala-2.13/io/apibuilder/generated/ApicollectiveApibuilderSpecV0Models.scala b/src/main/scala-2.13/io/apibuilder/generated/ApicollectiveApibuilderSpecV0Models.scala new file mode 100644 index 0000000..446afc9 --- /dev/null +++ b/src/main/scala-2.13/io/apibuilder/generated/ApicollectiveApibuilderSpecV0Models.scala @@ -0,0 +1,1426 @@ +/** + * Generated by API Builder - https://www.apibuilder.io + * Service version: 0.16.53 + * User agent: apibuilder app.apibuilder.io/apicollective/apibuilder-spec/latest/play_2_x_standalone_json + */ +package io.apibuilder.spec.v0.models { + + sealed trait ResponseCode extends _root_.scala.Product with _root_.scala.Serializable + /** + * Used to indicate an API concern for a field that is specific to the field's + * usage but not necessarily its data type. For example, you might use annotations + * to mark that certain fields contain PII or PCI data and thus should not be + * stored once processing is complete. Annotations communicate meaning to consumers + * of an API and may also be used within an implementation or tooling; for example, + * using static analysis tools to detect logging of sensitive data. + */ + + final case class Annotation( + name: String, + description: _root_.scala.Option[String] = None, + deprecation: _root_.scala.Option[io.apibuilder.spec.v0.models.Deprecation] = None + ) + + final case class Apidoc( + version: String + ) + + /** + * @param key Unique key identifying this application + */ + + final case class Application( + key: String + ) + + /** + * Represents an additional attribute that is attached to one of the objects in + * apibuilder. The main use case is to capture additional metadata that doesn't + * necessarily define the API but aids in code generation. Examples would be hints + * for certain code generators about classes to extend, interfaces to implement, + * annotations to add, names to assign to certain methods, etc. The specific + * attributes will be applicable only in the context of the specific code + * generators usings them. + */ + + final case class Attribute( + name: String, + value: _root_.play.api.libs.json.JsObject, + description: _root_.scala.Option[String] = None, + deprecation: _root_.scala.Option[io.apibuilder.spec.v0.models.Deprecation] = None + ) + + final case class Body( + `type`: String, + description: _root_.scala.Option[String] = None, + deprecation: _root_.scala.Option[io.apibuilder.spec.v0.models.Deprecation] = None, + attributes: Seq[io.apibuilder.spec.v0.models.Attribute] = Nil + ) + + /** + * Describes the primary contact for this service + */ + + final case class Contact( + name: _root_.scala.Option[String] = None, + url: _root_.scala.Option[String] = None, + email: _root_.scala.Option[String] = None + ) + + /** + * Indicates that this particular element is considered deprecated in the API. See + * the description for details + */ + + final case class Deprecation( + description: _root_.scala.Option[String] = None + ) + + final case class Enum( + name: String, + plural: String, + description: _root_.scala.Option[String] = None, + deprecation: _root_.scala.Option[io.apibuilder.spec.v0.models.Deprecation] = None, + values: Seq[io.apibuilder.spec.v0.models.EnumValue], + attributes: Seq[io.apibuilder.spec.v0.models.Attribute] = Nil + ) + + /** + * @param value The actual string representation of this value. If not specified, defaults to + * 'name' + */ + + final case class EnumValue( + name: String, + description: _root_.scala.Option[String] = None, + deprecation: _root_.scala.Option[io.apibuilder.spec.v0.models.Deprecation] = None, + attributes: Seq[io.apibuilder.spec.v0.models.Attribute] = Nil, + value: _root_.scala.Option[String] = None + ) + + final case class Field( + name: String, + `type`: String, + description: _root_.scala.Option[String] = None, + deprecation: _root_.scala.Option[io.apibuilder.spec.v0.models.Deprecation] = None, + default: _root_.scala.Option[String] = None, + required: Boolean, + minimum: _root_.scala.Option[Long] = None, + maximum: _root_.scala.Option[Long] = None, + example: _root_.scala.Option[String] = None, + attributes: Seq[io.apibuilder.spec.v0.models.Attribute] = Nil, + annotations: Seq[String] = Nil + ) + + final case class Header( + name: String, + `type`: String, + description: _root_.scala.Option[String] = None, + deprecation: _root_.scala.Option[io.apibuilder.spec.v0.models.Deprecation] = None, + required: Boolean, + default: _root_.scala.Option[String] = None, + attributes: Seq[io.apibuilder.spec.v0.models.Attribute] = Nil + ) + + /** + * An import is used to declare a dependency on another application. This allows + * you to reference the models and or enums from that application in your own app. + * + * @param uri Full URI to the service.json file of the service we are importing + * @param namespace the fully qualified namespace that we have imported + * @param version The version of the service that we are importing + * @param enums Enums made available by this import + * @param interfaces Interfaces made available by this import + * @param unions Unions made available by this import + * @param models Models made available by this import + * @param annotations Annotations made available by this import + */ + + final case class Import( + uri: String, + namespace: String, + organization: io.apibuilder.spec.v0.models.Organization, + application: io.apibuilder.spec.v0.models.Application, + version: String, + enums: Seq[String] = Nil, + interfaces: Seq[String] = Nil, + unions: Seq[String] = Nil, + models: Seq[String] = Nil, + annotations: Seq[io.apibuilder.spec.v0.models.Annotation] = Nil + ) + + /** + * General metadata about this service + */ + + final case class Info( + license: _root_.scala.Option[io.apibuilder.spec.v0.models.License] = None, + contact: _root_.scala.Option[io.apibuilder.spec.v0.models.Contact] = None + ) + + final case class Interface( + name: String, + plural: String, + description: _root_.scala.Option[String] = None, + deprecation: _root_.scala.Option[io.apibuilder.spec.v0.models.Deprecation] = None, + fields: Seq[io.apibuilder.spec.v0.models.Field], + attributes: Seq[io.apibuilder.spec.v0.models.Attribute] = Nil + ) + + /** + * Describes the software license contact for this service + */ + + final case class License( + name: String, + url: _root_.scala.Option[String] = None + ) + + final case class Model( + name: String, + plural: String, + description: _root_.scala.Option[String] = None, + deprecation: _root_.scala.Option[io.apibuilder.spec.v0.models.Deprecation] = None, + fields: Seq[io.apibuilder.spec.v0.models.Field], + attributes: Seq[io.apibuilder.spec.v0.models.Attribute] = Nil, + interfaces: Seq[String] = Nil + ) + + /** + * @param path The full path to this operation, relative to the service's base url. + */ + + final case class Operation( + method: io.apibuilder.spec.v0.models.Method, + path: String, + description: _root_.scala.Option[String] = None, + deprecation: _root_.scala.Option[io.apibuilder.spec.v0.models.Deprecation] = None, + body: _root_.scala.Option[io.apibuilder.spec.v0.models.Body] = None, + parameters: Seq[io.apibuilder.spec.v0.models.Parameter] = Nil, + responses: Seq[io.apibuilder.spec.v0.models.Response] = Nil, + attributes: Seq[io.apibuilder.spec.v0.models.Attribute] = Nil + ) + + /** + * @param key Unique key identifying the organization that owns this service + */ + + final case class Organization( + key: String + ) + + final case class Parameter( + name: String, + `type`: String, + location: io.apibuilder.spec.v0.models.ParameterLocation, + description: _root_.scala.Option[String] = None, + deprecation: _root_.scala.Option[io.apibuilder.spec.v0.models.Deprecation] = None, + required: Boolean, + default: _root_.scala.Option[String] = None, + minimum: _root_.scala.Option[Long] = None, + maximum: _root_.scala.Option[Long] = None, + example: _root_.scala.Option[String] = None, + attributes: _root_.scala.Option[Seq[io.apibuilder.spec.v0.models.Attribute]] = None + ) + + /** + * @param `type` The type of this resource will map to a defined model, enum, or union type + * @param path The path to this specific resource. This was added in 2016 to help us + * differentiate between the resource path and the operation path which can be + * helpful when, for example, generating method names for operations. This field is + * optional as some of our input formats (e.g. swagger) do not explicitly + * differentiate resoure paths. + */ + + final case class Resource( + `type`: String, + plural: String, + path: _root_.scala.Option[String] = None, + description: _root_.scala.Option[String] = None, + deprecation: _root_.scala.Option[io.apibuilder.spec.v0.models.Deprecation] = None, + operations: Seq[io.apibuilder.spec.v0.models.Operation], + attributes: Seq[io.apibuilder.spec.v0.models.Attribute] = Nil + ) + + final case class Response( + code: io.apibuilder.spec.v0.models.ResponseCode, + `type`: String, + headers: _root_.scala.Option[Seq[io.apibuilder.spec.v0.models.Header]] = None, + description: _root_.scala.Option[String] = None, + deprecation: _root_.scala.Option[io.apibuilder.spec.v0.models.Deprecation] = None, + attributes: _root_.scala.Option[Seq[io.apibuilder.spec.v0.models.Attribute]] = None + ) + + /** + * @param apidoc Documents that this is an apibuilder document, noting the specific version used. + * Internally the version is then used for backwards compatibility when applicable + * as new features are added to apibuilder. Note naming refers to the original name + * of this project, 'apidoc', and is left here to avoid a breaking change for + * preexisting services. + * @param namespace Fully qualified namespace for this service + */ + + final case class Service( + @deprecated("This field is no longer used in API Builder and may be removed in the future.") apidoc: _root_.scala.Option[io.apibuilder.spec.v0.models.Apidoc] = None, + name: String, + organization: io.apibuilder.spec.v0.models.Organization, + application: io.apibuilder.spec.v0.models.Application, + namespace: String, + version: String, + baseUrl: _root_.scala.Option[String] = None, + description: _root_.scala.Option[String] = None, + info: io.apibuilder.spec.v0.models.Info, + headers: Seq[io.apibuilder.spec.v0.models.Header] = Nil, + imports: Seq[io.apibuilder.spec.v0.models.Import] = Nil, + enums: Seq[io.apibuilder.spec.v0.models.Enum] = Nil, + interfaces: Seq[io.apibuilder.spec.v0.models.Interface] = Nil, + unions: Seq[io.apibuilder.spec.v0.models.Union] = Nil, + models: Seq[io.apibuilder.spec.v0.models.Model] = Nil, + resources: Seq[io.apibuilder.spec.v0.models.Resource] = Nil, + attributes: Seq[io.apibuilder.spec.v0.models.Attribute] = Nil, + annotations: Seq[io.apibuilder.spec.v0.models.Annotation] = Nil + ) + + /** + * @param discriminator If a type discriminator is provided, serialization of these union types will + * always contain a field named with the value of the discriminator that will + * contain the name of the type. This provides a simpler (for many use cases) JSON + * serialization/deserialization mechanism. When specified, apibuilder itself will + * verify that none of the types in the union type itself contain a field with the + * same name as the discriminator + * @param types The names of the types that make up this union type + */ + + final case class Union( + name: String, + plural: String, + discriminator: _root_.scala.Option[String] = None, + description: _root_.scala.Option[String] = None, + deprecation: _root_.scala.Option[io.apibuilder.spec.v0.models.Deprecation] = None, + types: Seq[io.apibuilder.spec.v0.models.UnionType], + attributes: Seq[io.apibuilder.spec.v0.models.Attribute] = Nil, + interfaces: Seq[String] = Nil + ) + + /** + * Metadata about one of the types that is part of a union type + * + * @param `type` The name of a type (a primitive, model name, or enum name) that makes up this + * union type + * @param default If true, indicates that this type should be used as the default when + * deserializing union types. This field is only used by union types that require a + * discriminator and sets the default value for that discriminator during + * deserialization. + * @param discriminatorValue The discriminator value defines the string to use in the discriminator field to + * identify this type. If not specified, the discriminator value will default to + * the name of the type itself. + */ + + final case class UnionType( + `type`: String, + description: _root_.scala.Option[String] = None, + deprecation: _root_.scala.Option[io.apibuilder.spec.v0.models.Deprecation] = None, + attributes: Seq[io.apibuilder.spec.v0.models.Attribute] = Nil, + default: _root_.scala.Option[Boolean] = None, + discriminatorValue: _root_.scala.Option[String] = None + ) + + /** + * Provides future compatibility in clients - in the future, when a type is added + * to the union ResponseCode, it will need to be handled in the client code. This + * implementation will deserialize these future types as an instance of this class. + * + * @param description Information about the type that we received that is undefined in this version of + * the client. + */ + + final case class ResponseCodeUndefinedType( + description: String + ) extends ResponseCode + + /** + * Wrapper class to support the union types containing the datatype[integer] + */ + + final case class ResponseCodeInt( + value: Int + ) extends ResponseCode + + sealed trait Method extends _root_.scala.Product with _root_.scala.Serializable + + object Method { + + case object Get extends Method { override def toString = "GET" } + case object Post extends Method { override def toString = "POST" } + case object Put extends Method { override def toString = "PUT" } + case object Patch extends Method { override def toString = "PATCH" } + case object Delete extends Method { override def toString = "DELETE" } + case object Head extends Method { override def toString = "HEAD" } + case object Connect extends Method { override def toString = "CONNECT" } + case object Options extends Method { override def toString = "OPTIONS" } + case object Trace extends Method { override def toString = "TRACE" } + /** + * UNDEFINED captures values that are sent either in error or + * that were added by the server after this library was + * generated. We want to make it easy and obvious for users of + * this library to handle this case gracefully. + * + * We use all CAPS for the variable name to avoid collisions + * with the camel cased values above. + */ + final case class UNDEFINED(override val toString: String) extends Method + + /** + * all returns a list of all the valid, known values. We use + * lower case to avoid collisions with the camel cased values + * above. + */ + val all: scala.List[Method] = scala.List(Get, Post, Put, Patch, Delete, Head, Connect, Options, Trace) + + private + val byName: Map[String, Method] = all.map(x => x.toString.toLowerCase -> x).toMap + + def apply(value: String): Method = fromString(value).getOrElse(UNDEFINED(value)) + + def fromString(value: String): _root_.scala.Option[Method] = byName.get(value.toLowerCase) + + } + + sealed trait ParameterLocation extends _root_.scala.Product with _root_.scala.Serializable + + object ParameterLocation { + + case object Path extends ParameterLocation { override def toString = "Path" } + case object Query extends ParameterLocation { override def toString = "Query" } + case object Form extends ParameterLocation { override def toString = "Form" } + case object Header extends ParameterLocation { override def toString = "Header" } + /** + * UNDEFINED captures values that are sent either in error or + * that were added by the server after this library was + * generated. We want to make it easy and obvious for users of + * this library to handle this case gracefully. + * + * We use all CAPS for the variable name to avoid collisions + * with the camel cased values above. + */ + final case class UNDEFINED(override val toString: String) extends ParameterLocation + + /** + * all returns a list of all the valid, known values. We use + * lower case to avoid collisions with the camel cased values + * above. + */ + val all: scala.List[ParameterLocation] = scala.List(Path, Query, Form, Header) + + private + val byName: Map[String, ParameterLocation] = all.map(x => x.toString.toLowerCase -> x).toMap + + def apply(value: String): ParameterLocation = fromString(value).getOrElse(UNDEFINED(value)) + + def fromString(value: String): _root_.scala.Option[ParameterLocation] = byName.get(value.toLowerCase) + + } + + sealed trait ResponseCodeOption extends ResponseCode + + object ResponseCodeOption { + + case object Default extends ResponseCodeOption { override def toString = "Default" } + /** + * UNDEFINED captures values that are sent either in error or + * that were added by the server after this library was + * generated. We want to make it easy and obvious for users of + * this library to handle this case gracefully. + * + * We use all CAPS for the variable name to avoid collisions + * with the camel cased values above. + */ + final case class UNDEFINED(override val toString: String) extends ResponseCodeOption + + /** + * all returns a list of all the valid, known values. We use + * lower case to avoid collisions with the camel cased values + * above. + */ + val all: scala.List[ResponseCodeOption] = scala.List(Default) + + private + val byName: Map[String, ResponseCodeOption] = all.map(x => x.toString.toLowerCase -> x).toMap + + def apply(value: String): ResponseCodeOption = fromString(value).getOrElse(UNDEFINED(value)) + + def fromString(value: String): _root_.scala.Option[ResponseCodeOption] = byName.get(value.toLowerCase) + + } + +} + +package io.apibuilder.spec.v0.models { + + package object json { + import play.api.libs.json.__ + import play.api.libs.json.JsString + import play.api.libs.json.Writes + import play.api.libs.functional.syntax._ + import io.apibuilder.spec.v0.models.json._ + + private[v0] implicit val jsonReadsUUID: play.api.libs.json.Reads[_root_.java.util.UUID] = __.read[String].map { str => + _root_.java.util.UUID.fromString(str) + } + + private[v0] implicit val jsonWritesUUID: play.api.libs.json.Writes[_root_.java.util.UUID] = (x: _root_.java.util.UUID) => play.api.libs.json.JsString(x.toString) + + private[v0] implicit val jsonReadsJodaDateTime: play.api.libs.json.Reads[_root_.org.joda.time.DateTime] = __.read[String].map { str => + _root_.org.joda.time.format.ISODateTimeFormat.dateTimeParser.parseDateTime(str) + } + + private[v0] implicit val jsonWritesJodaDateTime: play.api.libs.json.Writes[_root_.org.joda.time.DateTime] = (x: _root_.org.joda.time.DateTime) => { + play.api.libs.json.JsString(_root_.org.joda.time.format.ISODateTimeFormat.dateTime.print(x)) + } + + private[v0] implicit val jsonReadsJodaLocalDate: play.api.libs.json.Reads[_root_.org.joda.time.LocalDate] = __.read[String].map { str => + _root_.org.joda.time.format.ISODateTimeFormat.dateTimeParser.parseLocalDate(str) + } + + private[v0] implicit val jsonWritesJodaLocalDate: play.api.libs.json.Writes[_root_.org.joda.time.LocalDate] = (x: _root_.org.joda.time.LocalDate) => { + play.api.libs.json.JsString(_root_.org.joda.time.format.ISODateTimeFormat.date.print(x)) + } + + implicit val jsonReadsApibuilderSpecMethod: play.api.libs.json.Reads[io.apibuilder.spec.v0.models.Method] = new play.api.libs.json.Reads[io.apibuilder.spec.v0.models.Method] { + def reads(js: play.api.libs.json.JsValue): play.api.libs.json.JsResult[io.apibuilder.spec.v0.models.Method] = { + js match { + case v: play.api.libs.json.JsString => play.api.libs.json.JsSuccess(io.apibuilder.spec.v0.models.Method(v.value)) + case _ => { + (js \ "value").validate[String] match { + case play.api.libs.json.JsSuccess(v, _) => play.api.libs.json.JsSuccess(io.apibuilder.spec.v0.models.Method(v)) + case err: play.api.libs.json.JsError => + (js \ "method").validate[String] match { + case play.api.libs.json.JsSuccess(v, _) => play.api.libs.json.JsSuccess(io.apibuilder.spec.v0.models.Method(v)) + case err: play.api.libs.json.JsError => err + } + } + } + } + } + } + + def jsonWritesApibuilderSpecMethod(obj: io.apibuilder.spec.v0.models.Method) = { + play.api.libs.json.JsString(obj.toString) + } + + def jsObjectMethod(obj: io.apibuilder.spec.v0.models.Method) = { + play.api.libs.json.Json.obj("value" -> play.api.libs.json.JsString(obj.toString)) + } + + implicit def jsonWritesApibuilderSpecMethod: play.api.libs.json.Writes[Method] = { + (obj: io.apibuilder.spec.v0.models.Method) => { + io.apibuilder.spec.v0.models.json.jsonWritesApibuilderSpecMethod(obj) + } + } + + implicit val jsonReadsApibuilderSpecParameterLocation: play.api.libs.json.Reads[io.apibuilder.spec.v0.models.ParameterLocation] = new play.api.libs.json.Reads[io.apibuilder.spec.v0.models.ParameterLocation] { + def reads(js: play.api.libs.json.JsValue): play.api.libs.json.JsResult[io.apibuilder.spec.v0.models.ParameterLocation] = { + js match { + case v: play.api.libs.json.JsString => play.api.libs.json.JsSuccess(io.apibuilder.spec.v0.models.ParameterLocation(v.value)) + case _ => { + (js \ "value").validate[String] match { + case play.api.libs.json.JsSuccess(v, _) => play.api.libs.json.JsSuccess(io.apibuilder.spec.v0.models.ParameterLocation(v)) + case err: play.api.libs.json.JsError => + (js \ "parameter_location").validate[String] match { + case play.api.libs.json.JsSuccess(v, _) => play.api.libs.json.JsSuccess(io.apibuilder.spec.v0.models.ParameterLocation(v)) + case err: play.api.libs.json.JsError => err + } + } + } + } + } + } + + def jsonWritesApibuilderSpecParameterLocation(obj: io.apibuilder.spec.v0.models.ParameterLocation) = { + play.api.libs.json.JsString(obj.toString) + } + + def jsObjectParameterLocation(obj: io.apibuilder.spec.v0.models.ParameterLocation) = { + play.api.libs.json.Json.obj("value" -> play.api.libs.json.JsString(obj.toString)) + } + + implicit def jsonWritesApibuilderSpecParameterLocation: play.api.libs.json.Writes[ParameterLocation] = { + (obj: io.apibuilder.spec.v0.models.ParameterLocation) => { + io.apibuilder.spec.v0.models.json.jsonWritesApibuilderSpecParameterLocation(obj) + } + } + + implicit val jsonReadsApibuilderSpecResponseCodeOption: play.api.libs.json.Reads[io.apibuilder.spec.v0.models.ResponseCodeOption] = new play.api.libs.json.Reads[io.apibuilder.spec.v0.models.ResponseCodeOption] { + def reads(js: play.api.libs.json.JsValue): play.api.libs.json.JsResult[io.apibuilder.spec.v0.models.ResponseCodeOption] = { + js match { + case v: play.api.libs.json.JsString => play.api.libs.json.JsSuccess(io.apibuilder.spec.v0.models.ResponseCodeOption(v.value)) + case _ => { + (js \ "value").validate[String] match { + case play.api.libs.json.JsSuccess(v, _) => play.api.libs.json.JsSuccess(io.apibuilder.spec.v0.models.ResponseCodeOption(v)) + case err: play.api.libs.json.JsError => + (js \ "response_code_option").validate[String] match { + case play.api.libs.json.JsSuccess(v, _) => play.api.libs.json.JsSuccess(io.apibuilder.spec.v0.models.ResponseCodeOption(v)) + case err: play.api.libs.json.JsError => err + } + } + } + } + } + } + + def jsonWritesApibuilderSpecResponseCodeOption(obj: io.apibuilder.spec.v0.models.ResponseCodeOption) = { + play.api.libs.json.JsString(obj.toString) + } + + def jsObjectResponseCodeOption(obj: io.apibuilder.spec.v0.models.ResponseCodeOption) = { + play.api.libs.json.Json.obj("value" -> play.api.libs.json.JsString(obj.toString)) + } + + implicit def jsonWritesApibuilderSpecResponseCodeOption: play.api.libs.json.Writes[ResponseCodeOption] = { + (obj: io.apibuilder.spec.v0.models.ResponseCodeOption) => { + io.apibuilder.spec.v0.models.json.jsonWritesApibuilderSpecResponseCodeOption(obj) + } + } + + implicit def jsonReadsApibuilderSpecAnnotation: play.api.libs.json.Reads[io.apibuilder.spec.v0.models.Annotation] = { + for { + name <- (__ \ "name").read[String] + description <- (__ \ "description").readNullable[String] + deprecation <- (__ \ "deprecation").readNullable[io.apibuilder.spec.v0.models.Deprecation] + } yield Annotation(name, description, deprecation) + } + + def jsObjectAnnotation(obj: io.apibuilder.spec.v0.models.Annotation): play.api.libs.json.JsObject = { + play.api.libs.json.Json.obj( + "name" -> play.api.libs.json.JsString(obj.name) + ) ++ (obj.description match { + case None => play.api.libs.json.Json.obj() + case Some(x) => play.api.libs.json.Json.obj("description" -> play.api.libs.json.JsString(x)) + }) ++ + (obj.deprecation match { + case None => play.api.libs.json.Json.obj() + case Some(x) => play.api.libs.json.Json.obj("deprecation" -> io.apibuilder.spec.v0.models.json.jsObjectDeprecation(x)) + }) + } + + implicit def jsonWritesApibuilderSpecAnnotation: play.api.libs.json.Writes[Annotation] = { + (obj: io.apibuilder.spec.v0.models.Annotation) => { + io.apibuilder.spec.v0.models.json.jsObjectAnnotation(obj) + } + } + + implicit def jsonReadsApibuilderSpecApidoc: play.api.libs.json.Reads[io.apibuilder.spec.v0.models.Apidoc] = { + (__ \ "version").read[String].map { x => Apidoc(version = x) } + } + + def jsObjectApidoc(obj: io.apibuilder.spec.v0.models.Apidoc): play.api.libs.json.JsObject = { + play.api.libs.json.Json.obj( + "version" -> play.api.libs.json.JsString(obj.version) + ) + } + + implicit def jsonWritesApibuilderSpecApidoc: play.api.libs.json.Writes[Apidoc] = { + (obj: io.apibuilder.spec.v0.models.Apidoc) => { + io.apibuilder.spec.v0.models.json.jsObjectApidoc(obj) + } + } + + implicit def jsonReadsApibuilderSpecApplication: play.api.libs.json.Reads[io.apibuilder.spec.v0.models.Application] = { + (__ \ "key").read[String].map { x => Application(key = x) } + } + + def jsObjectApplication(obj: io.apibuilder.spec.v0.models.Application): play.api.libs.json.JsObject = { + play.api.libs.json.Json.obj( + "key" -> play.api.libs.json.JsString(obj.key) + ) + } + + implicit def jsonWritesApibuilderSpecApplication: play.api.libs.json.Writes[Application] = { + (obj: io.apibuilder.spec.v0.models.Application) => { + io.apibuilder.spec.v0.models.json.jsObjectApplication(obj) + } + } + + implicit def jsonReadsApibuilderSpecAttribute: play.api.libs.json.Reads[io.apibuilder.spec.v0.models.Attribute] = { + for { + name <- (__ \ "name").read[String] + value <- (__ \ "value").read[_root_.play.api.libs.json.JsObject] + description <- (__ \ "description").readNullable[String] + deprecation <- (__ \ "deprecation").readNullable[io.apibuilder.spec.v0.models.Deprecation] + } yield Attribute(name, value, description, deprecation) + } + + def jsObjectAttribute(obj: io.apibuilder.spec.v0.models.Attribute): play.api.libs.json.JsObject = { + play.api.libs.json.Json.obj( + "name" -> play.api.libs.json.JsString(obj.name), + "value" -> obj.value + ) ++ (obj.description match { + case None => play.api.libs.json.Json.obj() + case Some(x) => play.api.libs.json.Json.obj("description" -> play.api.libs.json.JsString(x)) + }) ++ + (obj.deprecation match { + case None => play.api.libs.json.Json.obj() + case Some(x) => play.api.libs.json.Json.obj("deprecation" -> io.apibuilder.spec.v0.models.json.jsObjectDeprecation(x)) + }) + } + + implicit def jsonWritesApibuilderSpecAttribute: play.api.libs.json.Writes[Attribute] = { + (obj: io.apibuilder.spec.v0.models.Attribute) => { + io.apibuilder.spec.v0.models.json.jsObjectAttribute(obj) + } + } + + implicit def jsonReadsApibuilderSpecBody: play.api.libs.json.Reads[io.apibuilder.spec.v0.models.Body] = { + for { + `type` <- (__ \ "type").read[String] + description <- (__ \ "description").readNullable[String] + deprecation <- (__ \ "deprecation").readNullable[io.apibuilder.spec.v0.models.Deprecation] + attributes <- (__ \ "attributes").read[Seq[io.apibuilder.spec.v0.models.Attribute]] + } yield Body(`type`, description, deprecation, attributes) + } + + def jsObjectBody(obj: io.apibuilder.spec.v0.models.Body): play.api.libs.json.JsObject = { + play.api.libs.json.Json.obj( + "type" -> play.api.libs.json.JsString(obj.`type`), + "attributes" -> play.api.libs.json.Json.toJson(obj.attributes) + ) ++ (obj.description match { + case None => play.api.libs.json.Json.obj() + case Some(x) => play.api.libs.json.Json.obj("description" -> play.api.libs.json.JsString(x)) + }) ++ + (obj.deprecation match { + case None => play.api.libs.json.Json.obj() + case Some(x) => play.api.libs.json.Json.obj("deprecation" -> io.apibuilder.spec.v0.models.json.jsObjectDeprecation(x)) + }) + } + + implicit def jsonWritesApibuilderSpecBody: play.api.libs.json.Writes[Body] = { + (obj: io.apibuilder.spec.v0.models.Body) => { + io.apibuilder.spec.v0.models.json.jsObjectBody(obj) + } + } + + implicit def jsonReadsApibuilderSpecContact: play.api.libs.json.Reads[io.apibuilder.spec.v0.models.Contact] = { + for { + name <- (__ \ "name").readNullable[String] + url <- (__ \ "url").readNullable[String] + email <- (__ \ "email").readNullable[String] + } yield Contact(name, url, email) + } + + def jsObjectContact(obj: io.apibuilder.spec.v0.models.Contact): play.api.libs.json.JsObject = { + (obj.name match { + case None => play.api.libs.json.Json.obj() + case Some(x) => play.api.libs.json.Json.obj("name" -> play.api.libs.json.JsString(x)) + }) ++ + (obj.url match { + case None => play.api.libs.json.Json.obj() + case Some(x) => play.api.libs.json.Json.obj("url" -> play.api.libs.json.JsString(x)) + }) ++ + (obj.email match { + case None => play.api.libs.json.Json.obj() + case Some(x) => play.api.libs.json.Json.obj("email" -> play.api.libs.json.JsString(x)) + }) + } + + implicit def jsonWritesApibuilderSpecContact: play.api.libs.json.Writes[Contact] = { + (obj: io.apibuilder.spec.v0.models.Contact) => { + io.apibuilder.spec.v0.models.json.jsObjectContact(obj) + } + } + + implicit def jsonReadsApibuilderSpecDeprecation: play.api.libs.json.Reads[io.apibuilder.spec.v0.models.Deprecation] = { + (__ \ "description").readNullable[String].map { x => Deprecation(description = x) } + } + + def jsObjectDeprecation(obj: io.apibuilder.spec.v0.models.Deprecation): play.api.libs.json.JsObject = { + (obj.description match { + case None => play.api.libs.json.Json.obj() + case Some(x) => play.api.libs.json.Json.obj("description" -> play.api.libs.json.JsString(x)) + }) + } + + implicit def jsonWritesApibuilderSpecDeprecation: play.api.libs.json.Writes[Deprecation] = { + (obj: io.apibuilder.spec.v0.models.Deprecation) => { + io.apibuilder.spec.v0.models.json.jsObjectDeprecation(obj) + } + } + + implicit def jsonReadsApibuilderSpecEnum: play.api.libs.json.Reads[io.apibuilder.spec.v0.models.Enum] = { + for { + name <- (__ \ "name").read[String] + plural <- (__ \ "plural").read[String] + description <- (__ \ "description").readNullable[String] + deprecation <- (__ \ "deprecation").readNullable[io.apibuilder.spec.v0.models.Deprecation] + values <- (__ \ "values").read[Seq[io.apibuilder.spec.v0.models.EnumValue]] + attributes <- (__ \ "attributes").read[Seq[io.apibuilder.spec.v0.models.Attribute]] + } yield Enum(name, plural, description, deprecation, values, attributes) + } + + def jsObjectEnum(obj: io.apibuilder.spec.v0.models.Enum): play.api.libs.json.JsObject = { + play.api.libs.json.Json.obj( + "name" -> play.api.libs.json.JsString(obj.name), + "plural" -> play.api.libs.json.JsString(obj.plural), + "values" -> play.api.libs.json.Json.toJson(obj.values), + "attributes" -> play.api.libs.json.Json.toJson(obj.attributes) + ) ++ (obj.description match { + case None => play.api.libs.json.Json.obj() + case Some(x) => play.api.libs.json.Json.obj("description" -> play.api.libs.json.JsString(x)) + }) ++ + (obj.deprecation match { + case None => play.api.libs.json.Json.obj() + case Some(x) => play.api.libs.json.Json.obj("deprecation" -> io.apibuilder.spec.v0.models.json.jsObjectDeprecation(x)) + }) + } + + implicit def jsonWritesApibuilderSpecEnum: play.api.libs.json.Writes[Enum] = { + (obj: io.apibuilder.spec.v0.models.Enum) => { + io.apibuilder.spec.v0.models.json.jsObjectEnum(obj) + } + } + + implicit def jsonReadsApibuilderSpecEnumValue: play.api.libs.json.Reads[io.apibuilder.spec.v0.models.EnumValue] = { + for { + name <- (__ \ "name").read[String] + description <- (__ \ "description").readNullable[String] + deprecation <- (__ \ "deprecation").readNullable[io.apibuilder.spec.v0.models.Deprecation] + attributes <- (__ \ "attributes").read[Seq[io.apibuilder.spec.v0.models.Attribute]] + value <- (__ \ "value").readNullable[String] + } yield EnumValue(name, description, deprecation, attributes, value) + } + + def jsObjectEnumValue(obj: io.apibuilder.spec.v0.models.EnumValue): play.api.libs.json.JsObject = { + play.api.libs.json.Json.obj( + "name" -> play.api.libs.json.JsString(obj.name), + "attributes" -> play.api.libs.json.Json.toJson(obj.attributes) + ) ++ (obj.description match { + case None => play.api.libs.json.Json.obj() + case Some(x) => play.api.libs.json.Json.obj("description" -> play.api.libs.json.JsString(x)) + }) ++ + (obj.deprecation match { + case None => play.api.libs.json.Json.obj() + case Some(x) => play.api.libs.json.Json.obj("deprecation" -> io.apibuilder.spec.v0.models.json.jsObjectDeprecation(x)) + }) ++ + (obj.value match { + case None => play.api.libs.json.Json.obj() + case Some(x) => play.api.libs.json.Json.obj("value" -> play.api.libs.json.JsString(x)) + }) + } + + implicit def jsonWritesApibuilderSpecEnumValue: play.api.libs.json.Writes[EnumValue] = { + (obj: io.apibuilder.spec.v0.models.EnumValue) => { + io.apibuilder.spec.v0.models.json.jsObjectEnumValue(obj) + } + } + + implicit def jsonReadsApibuilderSpecField: play.api.libs.json.Reads[io.apibuilder.spec.v0.models.Field] = { + for { + name <- (__ \ "name").read[String] + `type` <- (__ \ "type").read[String] + description <- (__ \ "description").readNullable[String] + deprecation <- (__ \ "deprecation").readNullable[io.apibuilder.spec.v0.models.Deprecation] + default <- (__ \ "default").readNullable[String] + required <- (__ \ "required").read[Boolean] + minimum <- (__ \ "minimum").readNullable[Long] + maximum <- (__ \ "maximum").readNullable[Long] + example <- (__ \ "example").readNullable[String] + attributes <- (__ \ "attributes").read[Seq[io.apibuilder.spec.v0.models.Attribute]] + annotations <- (__ \ "annotations").readWithDefault[Seq[String]](Nil) + } yield Field(name, `type`, description, deprecation, default, required, minimum, maximum, example, attributes, annotations) + } + + def jsObjectField(obj: io.apibuilder.spec.v0.models.Field): play.api.libs.json.JsObject = { + play.api.libs.json.Json.obj( + "name" -> play.api.libs.json.JsString(obj.name), + "type" -> play.api.libs.json.JsString(obj.`type`), + "required" -> play.api.libs.json.JsBoolean(obj.required), + "attributes" -> play.api.libs.json.Json.toJson(obj.attributes), + "annotations" -> play.api.libs.json.Json.toJson(obj.annotations) + ) ++ (obj.description match { + case None => play.api.libs.json.Json.obj() + case Some(x) => play.api.libs.json.Json.obj("description" -> play.api.libs.json.JsString(x)) + }) ++ + (obj.deprecation match { + case None => play.api.libs.json.Json.obj() + case Some(x) => play.api.libs.json.Json.obj("deprecation" -> io.apibuilder.spec.v0.models.json.jsObjectDeprecation(x)) + }) ++ + (obj.default match { + case None => play.api.libs.json.Json.obj() + case Some(x) => play.api.libs.json.Json.obj("default" -> play.api.libs.json.JsString(x)) + }) ++ + (obj.minimum match { + case None => play.api.libs.json.Json.obj() + case Some(x) => play.api.libs.json.Json.obj("minimum" -> play.api.libs.json.JsNumber(x)) + }) ++ + (obj.maximum match { + case None => play.api.libs.json.Json.obj() + case Some(x) => play.api.libs.json.Json.obj("maximum" -> play.api.libs.json.JsNumber(x)) + }) ++ + (obj.example match { + case None => play.api.libs.json.Json.obj() + case Some(x) => play.api.libs.json.Json.obj("example" -> play.api.libs.json.JsString(x)) + }) + } + + implicit def jsonWritesApibuilderSpecField: play.api.libs.json.Writes[Field] = { + (obj: io.apibuilder.spec.v0.models.Field) => { + io.apibuilder.spec.v0.models.json.jsObjectField(obj) + } + } + + implicit def jsonReadsApibuilderSpecHeader: play.api.libs.json.Reads[io.apibuilder.spec.v0.models.Header] = { + for { + name <- (__ \ "name").read[String] + `type` <- (__ \ "type").read[String] + description <- (__ \ "description").readNullable[String] + deprecation <- (__ \ "deprecation").readNullable[io.apibuilder.spec.v0.models.Deprecation] + required <- (__ \ "required").read[Boolean] + default <- (__ \ "default").readNullable[String] + attributes <- (__ \ "attributes").read[Seq[io.apibuilder.spec.v0.models.Attribute]] + } yield Header(name, `type`, description, deprecation, required, default, attributes) + } + + def jsObjectHeader(obj: io.apibuilder.spec.v0.models.Header): play.api.libs.json.JsObject = { + play.api.libs.json.Json.obj( + "name" -> play.api.libs.json.JsString(obj.name), + "type" -> play.api.libs.json.JsString(obj.`type`), + "required" -> play.api.libs.json.JsBoolean(obj.required), + "attributes" -> play.api.libs.json.Json.toJson(obj.attributes) + ) ++ (obj.description match { + case None => play.api.libs.json.Json.obj() + case Some(x) => play.api.libs.json.Json.obj("description" -> play.api.libs.json.JsString(x)) + }) ++ + (obj.deprecation match { + case None => play.api.libs.json.Json.obj() + case Some(x) => play.api.libs.json.Json.obj("deprecation" -> io.apibuilder.spec.v0.models.json.jsObjectDeprecation(x)) + }) ++ + (obj.default match { + case None => play.api.libs.json.Json.obj() + case Some(x) => play.api.libs.json.Json.obj("default" -> play.api.libs.json.JsString(x)) + }) + } + + implicit def jsonWritesApibuilderSpecHeader: play.api.libs.json.Writes[Header] = { + (obj: io.apibuilder.spec.v0.models.Header) => { + io.apibuilder.spec.v0.models.json.jsObjectHeader(obj) + } + } + + implicit def jsonReadsApibuilderSpecImport: play.api.libs.json.Reads[io.apibuilder.spec.v0.models.Import] = { + for { + uri <- (__ \ "uri").read[String] + namespace <- (__ \ "namespace").read[String] + organization <- (__ \ "organization").read[io.apibuilder.spec.v0.models.Organization] + application <- (__ \ "application").read[io.apibuilder.spec.v0.models.Application] + version <- (__ \ "version").read[String] + enums <- (__ \ "enums").read[Seq[String]] + interfaces <- (__ \ "interfaces").readWithDefault[Seq[String]](Nil) + unions <- (__ \ "unions").read[Seq[String]] + models <- (__ \ "models").read[Seq[String]] + annotations <- (__ \ "annotations").readWithDefault[Seq[io.apibuilder.spec.v0.models.Annotation]](Nil) + } yield Import(uri, namespace, organization, application, version, enums, interfaces, unions, models, annotations) + } + + def jsObjectImport(obj: io.apibuilder.spec.v0.models.Import): play.api.libs.json.JsObject = { + play.api.libs.json.Json.obj( + "uri" -> play.api.libs.json.JsString(obj.uri), + "namespace" -> play.api.libs.json.JsString(obj.namespace), + "organization" -> io.apibuilder.spec.v0.models.json.jsObjectOrganization(obj.organization), + "application" -> io.apibuilder.spec.v0.models.json.jsObjectApplication(obj.application), + "version" -> play.api.libs.json.JsString(obj.version), + "enums" -> play.api.libs.json.Json.toJson(obj.enums), + "interfaces" -> play.api.libs.json.Json.toJson(obj.interfaces), + "unions" -> play.api.libs.json.Json.toJson(obj.unions), + "models" -> play.api.libs.json.Json.toJson(obj.models), + "annotations" -> play.api.libs.json.Json.toJson(obj.annotations) + ) + } + + implicit def jsonWritesApibuilderSpecImport: play.api.libs.json.Writes[Import] = { + (obj: io.apibuilder.spec.v0.models.Import) => { + io.apibuilder.spec.v0.models.json.jsObjectImport(obj) + } + } + + implicit def jsonReadsApibuilderSpecInfo: play.api.libs.json.Reads[io.apibuilder.spec.v0.models.Info] = { + for { + license <- (__ \ "license").readNullable[io.apibuilder.spec.v0.models.License] + contact <- (__ \ "contact").readNullable[io.apibuilder.spec.v0.models.Contact] + } yield Info(license, contact) + } + + def jsObjectInfo(obj: io.apibuilder.spec.v0.models.Info): play.api.libs.json.JsObject = { + (obj.license match { + case None => play.api.libs.json.Json.obj() + case Some(x) => play.api.libs.json.Json.obj("license" -> io.apibuilder.spec.v0.models.json.jsObjectLicense(x)) + }) ++ + (obj.contact match { + case None => play.api.libs.json.Json.obj() + case Some(x) => play.api.libs.json.Json.obj("contact" -> io.apibuilder.spec.v0.models.json.jsObjectContact(x)) + }) + } + + implicit def jsonWritesApibuilderSpecInfo: play.api.libs.json.Writes[Info] = { + (obj: io.apibuilder.spec.v0.models.Info) => { + io.apibuilder.spec.v0.models.json.jsObjectInfo(obj) + } + } + + implicit def jsonReadsApibuilderSpecInterface: play.api.libs.json.Reads[io.apibuilder.spec.v0.models.Interface] = { + for { + name <- (__ \ "name").read[String] + plural <- (__ \ "plural").read[String] + description <- (__ \ "description").readNullable[String] + deprecation <- (__ \ "deprecation").readNullable[io.apibuilder.spec.v0.models.Deprecation] + fields <- (__ \ "fields").read[Seq[io.apibuilder.spec.v0.models.Field]] + attributes <- (__ \ "attributes").read[Seq[io.apibuilder.spec.v0.models.Attribute]] + } yield Interface(name, plural, description, deprecation, fields, attributes) + } + + def jsObjectInterface(obj: io.apibuilder.spec.v0.models.Interface): play.api.libs.json.JsObject = { + play.api.libs.json.Json.obj( + "name" -> play.api.libs.json.JsString(obj.name), + "plural" -> play.api.libs.json.JsString(obj.plural), + "fields" -> play.api.libs.json.Json.toJson(obj.fields), + "attributes" -> play.api.libs.json.Json.toJson(obj.attributes) + ) ++ (obj.description match { + case None => play.api.libs.json.Json.obj() + case Some(x) => play.api.libs.json.Json.obj("description" -> play.api.libs.json.JsString(x)) + }) ++ + (obj.deprecation match { + case None => play.api.libs.json.Json.obj() + case Some(x) => play.api.libs.json.Json.obj("deprecation" -> io.apibuilder.spec.v0.models.json.jsObjectDeprecation(x)) + }) + } + + implicit def jsonWritesApibuilderSpecInterface: play.api.libs.json.Writes[Interface] = { + (obj: io.apibuilder.spec.v0.models.Interface) => { + io.apibuilder.spec.v0.models.json.jsObjectInterface(obj) + } + } + + implicit def jsonReadsApibuilderSpecLicense: play.api.libs.json.Reads[io.apibuilder.spec.v0.models.License] = { + for { + name <- (__ \ "name").read[String] + url <- (__ \ "url").readNullable[String] + } yield License(name, url) + } + + def jsObjectLicense(obj: io.apibuilder.spec.v0.models.License): play.api.libs.json.JsObject = { + play.api.libs.json.Json.obj( + "name" -> play.api.libs.json.JsString(obj.name) + ) ++ (obj.url match { + case None => play.api.libs.json.Json.obj() + case Some(x) => play.api.libs.json.Json.obj("url" -> play.api.libs.json.JsString(x)) + }) + } + + implicit def jsonWritesApibuilderSpecLicense: play.api.libs.json.Writes[License] = { + (obj: io.apibuilder.spec.v0.models.License) => { + io.apibuilder.spec.v0.models.json.jsObjectLicense(obj) + } + } + + implicit def jsonReadsApibuilderSpecModel: play.api.libs.json.Reads[io.apibuilder.spec.v0.models.Model] = { + for { + name <- (__ \ "name").read[String] + plural <- (__ \ "plural").read[String] + description <- (__ \ "description").readNullable[String] + deprecation <- (__ \ "deprecation").readNullable[io.apibuilder.spec.v0.models.Deprecation] + fields <- (__ \ "fields").read[Seq[io.apibuilder.spec.v0.models.Field]] + attributes <- (__ \ "attributes").read[Seq[io.apibuilder.spec.v0.models.Attribute]] + interfaces <- (__ \ "interfaces").readWithDefault[Seq[String]](Nil) + } yield Model(name, plural, description, deprecation, fields, attributes, interfaces) + } + + def jsObjectModel(obj: io.apibuilder.spec.v0.models.Model): play.api.libs.json.JsObject = { + play.api.libs.json.Json.obj( + "name" -> play.api.libs.json.JsString(obj.name), + "plural" -> play.api.libs.json.JsString(obj.plural), + "fields" -> play.api.libs.json.Json.toJson(obj.fields), + "attributes" -> play.api.libs.json.Json.toJson(obj.attributes), + "interfaces" -> play.api.libs.json.Json.toJson(obj.interfaces) + ) ++ (obj.description match { + case None => play.api.libs.json.Json.obj() + case Some(x) => play.api.libs.json.Json.obj("description" -> play.api.libs.json.JsString(x)) + }) ++ + (obj.deprecation match { + case None => play.api.libs.json.Json.obj() + case Some(x) => play.api.libs.json.Json.obj("deprecation" -> io.apibuilder.spec.v0.models.json.jsObjectDeprecation(x)) + }) + } + + implicit def jsonWritesApibuilderSpecModel: play.api.libs.json.Writes[Model] = { + (obj: io.apibuilder.spec.v0.models.Model) => { + io.apibuilder.spec.v0.models.json.jsObjectModel(obj) + } + } + + implicit def jsonReadsApibuilderSpecOperation: play.api.libs.json.Reads[io.apibuilder.spec.v0.models.Operation] = { + for { + method <- (__ \ "method").read[io.apibuilder.spec.v0.models.Method] + path <- (__ \ "path").read[String] + description <- (__ \ "description").readNullable[String] + deprecation <- (__ \ "deprecation").readNullable[io.apibuilder.spec.v0.models.Deprecation] + body <- (__ \ "body").readNullable[io.apibuilder.spec.v0.models.Body] + parameters <- (__ \ "parameters").read[Seq[io.apibuilder.spec.v0.models.Parameter]] + responses <- (__ \ "responses").read[Seq[io.apibuilder.spec.v0.models.Response]] + attributes <- (__ \ "attributes").read[Seq[io.apibuilder.spec.v0.models.Attribute]] + } yield Operation(method, path, description, deprecation, body, parameters, responses, attributes) + } + + def jsObjectOperation(obj: io.apibuilder.spec.v0.models.Operation): play.api.libs.json.JsObject = { + play.api.libs.json.Json.obj( + "method" -> play.api.libs.json.JsString(obj.method.toString), + "path" -> play.api.libs.json.JsString(obj.path), + "parameters" -> play.api.libs.json.Json.toJson(obj.parameters), + "responses" -> play.api.libs.json.Json.toJson(obj.responses), + "attributes" -> play.api.libs.json.Json.toJson(obj.attributes) + ) ++ (obj.description match { + case None => play.api.libs.json.Json.obj() + case Some(x) => play.api.libs.json.Json.obj("description" -> play.api.libs.json.JsString(x)) + }) ++ + (obj.deprecation match { + case None => play.api.libs.json.Json.obj() + case Some(x) => play.api.libs.json.Json.obj("deprecation" -> io.apibuilder.spec.v0.models.json.jsObjectDeprecation(x)) + }) ++ + (obj.body match { + case None => play.api.libs.json.Json.obj() + case Some(x) => play.api.libs.json.Json.obj("body" -> io.apibuilder.spec.v0.models.json.jsObjectBody(x)) + }) + } + + implicit def jsonWritesApibuilderSpecOperation: play.api.libs.json.Writes[Operation] = { + (obj: io.apibuilder.spec.v0.models.Operation) => { + io.apibuilder.spec.v0.models.json.jsObjectOperation(obj) + } + } + + implicit def jsonReadsApibuilderSpecOrganization: play.api.libs.json.Reads[io.apibuilder.spec.v0.models.Organization] = { + (__ \ "key").read[String].map { x => Organization(key = x) } + } + + def jsObjectOrganization(obj: io.apibuilder.spec.v0.models.Organization): play.api.libs.json.JsObject = { + play.api.libs.json.Json.obj( + "key" -> play.api.libs.json.JsString(obj.key) + ) + } + + implicit def jsonWritesApibuilderSpecOrganization: play.api.libs.json.Writes[Organization] = { + (obj: io.apibuilder.spec.v0.models.Organization) => { + io.apibuilder.spec.v0.models.json.jsObjectOrganization(obj) + } + } + + implicit def jsonReadsApibuilderSpecParameter: play.api.libs.json.Reads[io.apibuilder.spec.v0.models.Parameter] = { + for { + name <- (__ \ "name").read[String] + `type` <- (__ \ "type").read[String] + location <- (__ \ "location").read[io.apibuilder.spec.v0.models.ParameterLocation] + description <- (__ \ "description").readNullable[String] + deprecation <- (__ \ "deprecation").readNullable[io.apibuilder.spec.v0.models.Deprecation] + required <- (__ \ "required").read[Boolean] + default <- (__ \ "default").readNullable[String] + minimum <- (__ \ "minimum").readNullable[Long] + maximum <- (__ \ "maximum").readNullable[Long] + example <- (__ \ "example").readNullable[String] + attributes <- (__ \ "attributes").readNullable[Seq[io.apibuilder.spec.v0.models.Attribute]] + } yield Parameter(name, `type`, location, description, deprecation, required, default, minimum, maximum, example, attributes) + } + + def jsObjectParameter(obj: io.apibuilder.spec.v0.models.Parameter): play.api.libs.json.JsObject = { + play.api.libs.json.Json.obj( + "name" -> play.api.libs.json.JsString(obj.name), + "type" -> play.api.libs.json.JsString(obj.`type`), + "location" -> play.api.libs.json.JsString(obj.location.toString), + "required" -> play.api.libs.json.JsBoolean(obj.required) + ) ++ (obj.description match { + case None => play.api.libs.json.Json.obj() + case Some(x) => play.api.libs.json.Json.obj("description" -> play.api.libs.json.JsString(x)) + }) ++ + (obj.deprecation match { + case None => play.api.libs.json.Json.obj() + case Some(x) => play.api.libs.json.Json.obj("deprecation" -> io.apibuilder.spec.v0.models.json.jsObjectDeprecation(x)) + }) ++ + (obj.default match { + case None => play.api.libs.json.Json.obj() + case Some(x) => play.api.libs.json.Json.obj("default" -> play.api.libs.json.JsString(x)) + }) ++ + (obj.minimum match { + case None => play.api.libs.json.Json.obj() + case Some(x) => play.api.libs.json.Json.obj("minimum" -> play.api.libs.json.JsNumber(x)) + }) ++ + (obj.maximum match { + case None => play.api.libs.json.Json.obj() + case Some(x) => play.api.libs.json.Json.obj("maximum" -> play.api.libs.json.JsNumber(x)) + }) ++ + (obj.example match { + case None => play.api.libs.json.Json.obj() + case Some(x) => play.api.libs.json.Json.obj("example" -> play.api.libs.json.JsString(x)) + }) ++ + (obj.attributes match { + case None => play.api.libs.json.Json.obj() + case Some(x) => play.api.libs.json.Json.obj("attributes" -> play.api.libs.json.Json.toJson(x)) + }) + } + + implicit def jsonWritesApibuilderSpecParameter: play.api.libs.json.Writes[Parameter] = { + (obj: io.apibuilder.spec.v0.models.Parameter) => { + io.apibuilder.spec.v0.models.json.jsObjectParameter(obj) + } + } + + implicit def jsonReadsApibuilderSpecResource: play.api.libs.json.Reads[io.apibuilder.spec.v0.models.Resource] = { + for { + `type` <- (__ \ "type").read[String] + plural <- (__ \ "plural").read[String] + path <- (__ \ "path").readNullable[String] + description <- (__ \ "description").readNullable[String] + deprecation <- (__ \ "deprecation").readNullable[io.apibuilder.spec.v0.models.Deprecation] + operations <- (__ \ "operations").read[Seq[io.apibuilder.spec.v0.models.Operation]] + attributes <- (__ \ "attributes").read[Seq[io.apibuilder.spec.v0.models.Attribute]] + } yield Resource(`type`, plural, path, description, deprecation, operations, attributes) + } + + def jsObjectResource(obj: io.apibuilder.spec.v0.models.Resource): play.api.libs.json.JsObject = { + play.api.libs.json.Json.obj( + "type" -> play.api.libs.json.JsString(obj.`type`), + "plural" -> play.api.libs.json.JsString(obj.plural), + "operations" -> play.api.libs.json.Json.toJson(obj.operations), + "attributes" -> play.api.libs.json.Json.toJson(obj.attributes) + ) ++ (obj.path match { + case None => play.api.libs.json.Json.obj() + case Some(x) => play.api.libs.json.Json.obj("path" -> play.api.libs.json.JsString(x)) + }) ++ + (obj.description match { + case None => play.api.libs.json.Json.obj() + case Some(x) => play.api.libs.json.Json.obj("description" -> play.api.libs.json.JsString(x)) + }) ++ + (obj.deprecation match { + case None => play.api.libs.json.Json.obj() + case Some(x) => play.api.libs.json.Json.obj("deprecation" -> io.apibuilder.spec.v0.models.json.jsObjectDeprecation(x)) + }) + } + + implicit def jsonWritesApibuilderSpecResource: play.api.libs.json.Writes[Resource] = { + (obj: io.apibuilder.spec.v0.models.Resource) => { + io.apibuilder.spec.v0.models.json.jsObjectResource(obj) + } + } + + implicit def jsonReadsApibuilderSpecResponse: play.api.libs.json.Reads[io.apibuilder.spec.v0.models.Response] = { + for { + code <- (__ \ "code").read[io.apibuilder.spec.v0.models.ResponseCode] + `type` <- (__ \ "type").read[String] + headers <- (__ \ "headers").readNullable[Seq[io.apibuilder.spec.v0.models.Header]] + description <- (__ \ "description").readNullable[String] + deprecation <- (__ \ "deprecation").readNullable[io.apibuilder.spec.v0.models.Deprecation] + attributes <- (__ \ "attributes").readNullable[Seq[io.apibuilder.spec.v0.models.Attribute]] + } yield Response(code, `type`, headers, description, deprecation, attributes) + } + + def jsObjectResponse(obj: io.apibuilder.spec.v0.models.Response): play.api.libs.json.JsObject = { + play.api.libs.json.Json.obj( + "code" -> io.apibuilder.spec.v0.models.json.jsObjectResponseCode(obj.code), + "type" -> play.api.libs.json.JsString(obj.`type`) + ) ++ (obj.headers match { + case None => play.api.libs.json.Json.obj() + case Some(x) => play.api.libs.json.Json.obj("headers" -> play.api.libs.json.Json.toJson(x)) + }) ++ + (obj.description match { + case None => play.api.libs.json.Json.obj() + case Some(x) => play.api.libs.json.Json.obj("description" -> play.api.libs.json.JsString(x)) + }) ++ + (obj.deprecation match { + case None => play.api.libs.json.Json.obj() + case Some(x) => play.api.libs.json.Json.obj("deprecation" -> io.apibuilder.spec.v0.models.json.jsObjectDeprecation(x)) + }) ++ + (obj.attributes match { + case None => play.api.libs.json.Json.obj() + case Some(x) => play.api.libs.json.Json.obj("attributes" -> play.api.libs.json.Json.toJson(x)) + }) + } + + implicit def jsonWritesApibuilderSpecResponse: play.api.libs.json.Writes[Response] = { + (obj: io.apibuilder.spec.v0.models.Response) => { + io.apibuilder.spec.v0.models.json.jsObjectResponse(obj) + } + } + + implicit def jsonReadsApibuilderSpecService: play.api.libs.json.Reads[io.apibuilder.spec.v0.models.Service] = { + for { + apidoc <- (__ \ "apidoc").readNullable[io.apibuilder.spec.v0.models.Apidoc] + name <- (__ \ "name").read[String] + organization <- (__ \ "organization").read[io.apibuilder.spec.v0.models.Organization] + application <- (__ \ "application").read[io.apibuilder.spec.v0.models.Application] + namespace <- (__ \ "namespace").read[String] + version <- (__ \ "version").read[String] + baseUrl <- (__ \ "base_url").readNullable[String] + description <- (__ \ "description").readNullable[String] + info <- (__ \ "info").read[io.apibuilder.spec.v0.models.Info] + headers <- (__ \ "headers").read[Seq[io.apibuilder.spec.v0.models.Header]] + imports <- (__ \ "imports").read[Seq[io.apibuilder.spec.v0.models.Import]] + enums <- (__ \ "enums").read[Seq[io.apibuilder.spec.v0.models.Enum]] + interfaces <- (__ \ "interfaces").readWithDefault[Seq[io.apibuilder.spec.v0.models.Interface]](Nil) + unions <- (__ \ "unions").read[Seq[io.apibuilder.spec.v0.models.Union]] + models <- (__ \ "models").read[Seq[io.apibuilder.spec.v0.models.Model]] + resources <- (__ \ "resources").read[Seq[io.apibuilder.spec.v0.models.Resource]] + attributes <- (__ \ "attributes").read[Seq[io.apibuilder.spec.v0.models.Attribute]] + annotations <- (__ \ "annotations").readWithDefault[Seq[io.apibuilder.spec.v0.models.Annotation]](Nil) + } yield Service(apidoc, name, organization, application, namespace, version, baseUrl, description, info, headers, imports, enums, interfaces, unions, models, resources, attributes, annotations) + } + + def jsObjectService(obj: io.apibuilder.spec.v0.models.Service): play.api.libs.json.JsObject = { + play.api.libs.json.Json.obj( + "name" -> play.api.libs.json.JsString(obj.name), + "organization" -> io.apibuilder.spec.v0.models.json.jsObjectOrganization(obj.organization), + "application" -> io.apibuilder.spec.v0.models.json.jsObjectApplication(obj.application), + "namespace" -> play.api.libs.json.JsString(obj.namespace), + "version" -> play.api.libs.json.JsString(obj.version), + "info" -> io.apibuilder.spec.v0.models.json.jsObjectInfo(obj.info), + "headers" -> play.api.libs.json.Json.toJson(obj.headers), + "imports" -> play.api.libs.json.Json.toJson(obj.imports), + "enums" -> play.api.libs.json.Json.toJson(obj.enums), + "interfaces" -> play.api.libs.json.Json.toJson(obj.interfaces), + "unions" -> play.api.libs.json.Json.toJson(obj.unions), + "models" -> play.api.libs.json.Json.toJson(obj.models), + "resources" -> play.api.libs.json.Json.toJson(obj.resources), + "attributes" -> play.api.libs.json.Json.toJson(obj.attributes), + "annotations" -> play.api.libs.json.Json.toJson(obj.annotations) + ) ++ (obj.apidoc match { + case None => play.api.libs.json.Json.obj() + case Some(x) => play.api.libs.json.Json.obj("apidoc" -> io.apibuilder.spec.v0.models.json.jsObjectApidoc(x)) + }) ++ + (obj.baseUrl match { + case None => play.api.libs.json.Json.obj() + case Some(x) => play.api.libs.json.Json.obj("base_url" -> play.api.libs.json.JsString(x)) + }) ++ + (obj.description match { + case None => play.api.libs.json.Json.obj() + case Some(x) => play.api.libs.json.Json.obj("description" -> play.api.libs.json.JsString(x)) + }) + } + + implicit def jsonWritesApibuilderSpecService: play.api.libs.json.Writes[Service] = { + (obj: io.apibuilder.spec.v0.models.Service) => { + io.apibuilder.spec.v0.models.json.jsObjectService(obj) + } + } + + implicit def jsonReadsApibuilderSpecUnion: play.api.libs.json.Reads[io.apibuilder.spec.v0.models.Union] = { + for { + name <- (__ \ "name").read[String] + plural <- (__ \ "plural").read[String] + discriminator <- (__ \ "discriminator").readNullable[String] + description <- (__ \ "description").readNullable[String] + deprecation <- (__ \ "deprecation").readNullable[io.apibuilder.spec.v0.models.Deprecation] + types <- (__ \ "types").read[Seq[io.apibuilder.spec.v0.models.UnionType]] + attributes <- (__ \ "attributes").read[Seq[io.apibuilder.spec.v0.models.Attribute]] + interfaces <- (__ \ "interfaces").readWithDefault[Seq[String]](Nil) + } yield Union(name, plural, discriminator, description, deprecation, types, attributes, interfaces) + } + + def jsObjectUnion(obj: io.apibuilder.spec.v0.models.Union): play.api.libs.json.JsObject = { + play.api.libs.json.Json.obj( + "name" -> play.api.libs.json.JsString(obj.name), + "plural" -> play.api.libs.json.JsString(obj.plural), + "types" -> play.api.libs.json.Json.toJson(obj.types), + "attributes" -> play.api.libs.json.Json.toJson(obj.attributes), + "interfaces" -> play.api.libs.json.Json.toJson(obj.interfaces) + ) ++ (obj.discriminator match { + case None => play.api.libs.json.Json.obj() + case Some(x) => play.api.libs.json.Json.obj("discriminator" -> play.api.libs.json.JsString(x)) + }) ++ + (obj.description match { + case None => play.api.libs.json.Json.obj() + case Some(x) => play.api.libs.json.Json.obj("description" -> play.api.libs.json.JsString(x)) + }) ++ + (obj.deprecation match { + case None => play.api.libs.json.Json.obj() + case Some(x) => play.api.libs.json.Json.obj("deprecation" -> io.apibuilder.spec.v0.models.json.jsObjectDeprecation(x)) + }) + } + + implicit def jsonWritesApibuilderSpecUnion: play.api.libs.json.Writes[Union] = { + (obj: io.apibuilder.spec.v0.models.Union) => { + io.apibuilder.spec.v0.models.json.jsObjectUnion(obj) + } + } + + implicit def jsonReadsApibuilderSpecUnionType: play.api.libs.json.Reads[io.apibuilder.spec.v0.models.UnionType] = { + for { + `type` <- (__ \ "type").read[String] + description <- (__ \ "description").readNullable[String] + deprecation <- (__ \ "deprecation").readNullable[io.apibuilder.spec.v0.models.Deprecation] + attributes <- (__ \ "attributes").read[Seq[io.apibuilder.spec.v0.models.Attribute]] + default <- (__ \ "default").readNullable[Boolean] + discriminatorValue <- (__ \ "discriminator_value").readNullable[String] + } yield UnionType(`type`, description, deprecation, attributes, default, discriminatorValue) + } + + def jsObjectUnionType(obj: io.apibuilder.spec.v0.models.UnionType): play.api.libs.json.JsObject = { + play.api.libs.json.Json.obj( + "type" -> play.api.libs.json.JsString(obj.`type`), + "attributes" -> play.api.libs.json.Json.toJson(obj.attributes) + ) ++ (obj.description match { + case None => play.api.libs.json.Json.obj() + case Some(x) => play.api.libs.json.Json.obj("description" -> play.api.libs.json.JsString(x)) + }) ++ + (obj.deprecation match { + case None => play.api.libs.json.Json.obj() + case Some(x) => play.api.libs.json.Json.obj("deprecation" -> io.apibuilder.spec.v0.models.json.jsObjectDeprecation(x)) + }) ++ + (obj.default match { + case None => play.api.libs.json.Json.obj() + case Some(x) => play.api.libs.json.Json.obj("default" -> play.api.libs.json.JsBoolean(x)) + }) ++ + (obj.discriminatorValue match { + case None => play.api.libs.json.Json.obj() + case Some(x) => play.api.libs.json.Json.obj("discriminator_value" -> play.api.libs.json.JsString(x)) + }) + } + + implicit def jsonWritesApibuilderSpecUnionType: play.api.libs.json.Writes[UnionType] = { + (obj: io.apibuilder.spec.v0.models.UnionType) => { + io.apibuilder.spec.v0.models.json.jsObjectUnionType(obj) + } + } + + implicit def jsonReadsApibuilderSpecResponseCodeInt: play.api.libs.json.Reads[io.apibuilder.spec.v0.models.ResponseCodeInt] = { + (__ \ "value").read[Int].map { x => ResponseCodeInt(value = x) } + } + + implicit def jsonReadsApibuilderSpecResponseCode: play.api.libs.json.Reads[io.apibuilder.spec.v0.models.ResponseCode] = { + ( + (__ \ "integer").read(jsonReadsApibuilderSpecResponseCodeInt).asInstanceOf[play.api.libs.json.Reads[ResponseCode]] + orElse + (__ \ "response_code_option").read(jsonReadsApibuilderSpecResponseCodeOption).asInstanceOf[play.api.libs.json.Reads[ResponseCode]] + orElse + play.api.libs.json.Reads(jsValue => play.api.libs.json.JsSuccess(ResponseCodeUndefinedType(jsValue.toString))).asInstanceOf[play.api.libs.json.Reads[ResponseCode]] + ) + } + + def jsObjectResponseCode(obj: io.apibuilder.spec.v0.models.ResponseCode): play.api.libs.json.JsObject = { + obj match { + case x: io.apibuilder.spec.v0.models.ResponseCodeInt => play.api.libs.json.Json.obj("integer" -> play.api.libs.json.Json.obj("value" -> play.api.libs.json.JsNumber(x.value))) + case x: io.apibuilder.spec.v0.models.ResponseCodeOption => play.api.libs.json.Json.obj("response_code_option" -> play.api.libs.json.JsString(x.toString)) + case x: io.apibuilder.spec.v0.models.ResponseCodeUndefinedType => { + scala.util.Try { + // If we received a JSON object - echo it back. This is a workaround for a bug in + // serialization for unions w/out discriminators where they sometimes have the + // type wrapper and sometimes do not + play.api.libs.json.Json.parse(x.description).asInstanceOf[play.api.libs.json.JsObject] + } match { + case scala.util.Success(o) => o + case scala.util.Failure(_) => sys.error("The type[io.apibuilder.spec.v0.models.ResponseCodeUndefinedType] should never be serialized") + } + } + } + } + implicit def jsonWritesApibuilderSpecResponseCode: play.api.libs.json.Writes[ResponseCode] = { + (obj: io.apibuilder.spec.v0.models.ResponseCode) => { + io.apibuilder.spec.v0.models.json.jsObjectResponseCode(obj) + } + } + } +} + diff --git a/src/main/scala/io/apibuilder/generated/ApicollectiveApibuilderSpecV0Models.scala b/src/main/scala-3/io/apibuilder/generated/ApicollectiveApibuilderSpecV0Models.scala similarity index 98% rename from src/main/scala/io/apibuilder/generated/ApicollectiveApibuilderSpecV0Models.scala rename to src/main/scala-3/io/apibuilder/generated/ApicollectiveApibuilderSpecV0Models.scala index 9c08c58..6f8a058 100644 --- a/src/main/scala/io/apibuilder/generated/ApicollectiveApibuilderSpecV0Models.scala +++ b/src/main/scala-3/io/apibuilder/generated/ApicollectiveApibuilderSpecV0Models.scala @@ -1,7 +1,7 @@ /** * Generated by API Builder - https://www.apibuilder.io * Service version: 0.16.53 - * User agent: apibuilder localhost 9000/apicollective/apibuilder-spec/latest/play_2_x_scala_3_standalone_json + * User agent: apibuilder app.apibuilder.io/apicollective/apibuilder-spec/latest/play_2_x_scala_3_standalone_json */ package io.apibuilder.spec.v0.models { @@ -261,7 +261,9 @@ package io.apibuilder.spec.v0.models { */ final case class Service( - @deprecated("This field is no longer used in API Builder and may be removed in the future.") apidoc: _root_.scala.Option[io.apibuilder.spec.v0.models.Apidoc] = None, + // TODO - Hack to get around lack of -Wconf:src support in scalac 3.4.2 + // @deprecated("This field is no longer used in API Builder and may be removed in the future.") apidoc: _root_.scala.Option[io.apibuilder.spec.v0.models.Apidoc] = None, + apidoc: _root_.scala.Option[io.apibuilder.spec.v0.models.Apidoc] = None, name: String, organization: io.apibuilder.spec.v0.models.Organization, application: io.apibuilder.spec.v0.models.Application, @@ -1416,7 +1418,17 @@ package io.apibuilder.spec.v0.models { obj match { case x: io.apibuilder.spec.v0.models.ResponseCodeInt => play.api.libs.json.Json.obj("integer" -> play.api.libs.json.Json.obj("value" -> play.api.libs.json.JsNumber(x.value))) case x: io.apibuilder.spec.v0.models.ResponseCodeOption => play.api.libs.json.Json.obj("response_code_option" -> play.api.libs.json.JsString(x.toString)) - case x: io.apibuilder.spec.v0.models.ResponseCodeUndefinedType => sys.error(s"The type[io.apibuilder.spec.v0.models.ResponseCodeUndefinedType] should never be serialized") + case x: io.apibuilder.spec.v0.models.ResponseCodeUndefinedType => { + scala.util.Try { + // If we received a JSON object - echo it back. This is a workaround for a bug in + // serialization for unions w/out discriminators where they sometimes have the + // type wrapper and sometimes do not + play.api.libs.json.Json.parse(x.description).asInstanceOf[play.api.libs.json.JsObject] + } match { + case scala.util.Success(o) => o + case scala.util.Failure(_) => sys.error("The type[io.apibuilder.spec.v0.models.ResponseCodeUndefinedType] should never be serialized") + } + } } } diff --git a/src/main/scala/io/apibuilder/ApiBuilderHelper.scala b/src/main/scala/io/apibuilder/ApiBuilderHelper.scala index 9af223a..22cde7a 100644 --- a/src/main/scala/io/apibuilder/ApiBuilderHelper.scala +++ b/src/main/scala/io/apibuilder/ApiBuilderHelper.scala @@ -1,7 +1,7 @@ package apibuilder -import io.apibuilder.spec.v0.models.* -import io.apibuilder.validation.* +import io.apibuilder.spec.v0.models._ +import io.apibuilder.validation._ import scala.annotation.tailrec import scala.util.matching.Regex diff --git a/src/main/scala/io/apibuilder/validation/ApiBuilderService.scala b/src/main/scala/io/apibuilder/validation/ApiBuilderService.scala index c73d42c..d7090f9 100644 --- a/src/main/scala/io/apibuilder/validation/ApiBuilderService.scala +++ b/src/main/scala/io/apibuilder/validation/ApiBuilderService.scala @@ -5,11 +5,11 @@ import cats.data.ValidatedNec import java.io.{BufferedInputStream, ByteArrayOutputStream, File, FileInputStream, InputStream} import io.apibuilder.spec.v0.models.{Method, Operation, Service} -import io.apibuilder.spec.v0.models.json.* +import io.apibuilder.spec.v0.models.json._ import java.nio.charset.StandardCharsets import io.apibuilder.validation.util.UrlDownloader -import play.api.libs.json.* +import play.api.libs.json._ /** * Wraps a single API Builder service, providing helpers to validate diff --git a/src/main/scala/io/apibuilder/validation/DynamicRouteMap.scala b/src/main/scala/io/apibuilder/validation/DynamicRouteMap.scala index 258c2db..ec2a041 100644 --- a/src/main/scala/io/apibuilder/validation/DynamicRouteMap.scala +++ b/src/main/scala/io/apibuilder/validation/DynamicRouteMap.scala @@ -7,11 +7,11 @@ case class StaticRouteMap(routes: Seq[OperationWithRoute]) { s"$method$path" } - private val lookup: Map[String, OperationWithRoute] = Map( + private val lookup: Map[String, OperationWithRoute] = { routes.map { op => key(op.route.method, op.route.path) -> op - }* - ) + }.toMap + } def find(method: Method, path: String): Option[OperationWithRoute] = { lookup.get(key(method, path)) diff --git a/src/main/scala/io/apibuilder/validation/MultiService.scala b/src/main/scala/io/apibuilder/validation/MultiService.scala index 648fa5a..133dd76 100644 --- a/src/main/scala/io/apibuilder/validation/MultiService.scala +++ b/src/main/scala/io/apibuilder/validation/MultiService.scala @@ -2,10 +2,10 @@ package io.apibuilder.validation import cats.implicits._ import cats.data.ValidatedNec -import io.apibuilder.spec.v0.models.* +import io.apibuilder.spec.v0.models._ import io.apibuilder.validation.util.{FileOrder, StandardErrors} import io.apibuilder.validation.zip.ZipFileReader -import play.api.libs.json.* +import play.api.libs.json._ /** * Wrapper to work with multiple API Builder services. diff --git a/src/main/scala/io/apibuilder/validation/PathNormalizer.scala b/src/main/scala/io/apibuilder/validation/PathNormalizer.scala index 3e260fa..f04c655 100644 --- a/src/main/scala/io/apibuilder/validation/PathNormalizer.scala +++ b/src/main/scala/io/apibuilder/validation/PathNormalizer.scala @@ -1,7 +1,7 @@ package io.apibuilder.validation import cats.data.ValidatedNec -import cats.implicits.* +import cats.implicits._ import io.apibuilder.spec.v0.models.{Method, Operation, Service} import io.apibuilder.validation.util.StandardErrors diff --git a/src/test/scala/io/apibuilder/util/UnionToModelBuilderSpec.scala b/src/test/scala/io/apibuilder/util/UnionToModelBuilderSpec.scala index d134725..6afee22 100644 --- a/src/test/scala/io/apibuilder/util/UnionToModelBuilderSpec.scala +++ b/src/test/scala/io/apibuilder/util/UnionToModelBuilderSpec.scala @@ -2,7 +2,7 @@ package io.apibuilder.validation.util import cats.data.Validated.{Invalid, Valid} import io.apibuilder.builders.{ApiBuilderServiceBuilders, MultiServiceBuilders} -import io.apibuilder.spec.v0.models.* +import io.apibuilder.spec.v0.models._ import io.apibuilder.util.{UnionModel, UnionToModelBuilder} import io.apibuilder.validation.{ApiBuilderService, ApiBuilderType} import org.scalatest.Assertion diff --git a/src/test/scala/io/apibuilder/validation/JsonValidatorSpec.scala b/src/test/scala/io/apibuilder/validation/JsonValidatorSpec.scala index 81f623e..14431bd 100644 --- a/src/test/scala/io/apibuilder/validation/JsonValidatorSpec.scala +++ b/src/test/scala/io/apibuilder/validation/JsonValidatorSpec.scala @@ -7,7 +7,7 @@ import io.apibuilder.spec.v0.models.Service import org.joda.time.DateTime import org.scalatest.matchers.must.Matchers import org.scalatest.wordspec.AnyWordSpec -import play.api.libs.json.* +import play.api.libs.json._ class JsonValidatorSpec extends AnyWordSpec with Matchers with Helpers with TestHelpers with ApiBuilderServiceBuilders { diff --git a/src/test/scala/io/apibuilder/validation/MultiServiceImplSpec.scala b/src/test/scala/io/apibuilder/validation/MultiServiceImplSpec.scala index 615ab18..c2a44c5 100644 --- a/src/test/scala/io/apibuilder/validation/MultiServiceImplSpec.scala +++ b/src/test/scala/io/apibuilder/validation/MultiServiceImplSpec.scala @@ -5,7 +5,7 @@ import io.apibuilder.helpers.{Helpers, TestHelpers} import io.apibuilder.spec.v0.models.Method import org.scalatest.matchers.must.Matchers import org.scalatest.wordspec.AnyWordSpec -import play.api.libs.json.* +import play.api.libs.json._ class MultiServiceImplSpec extends AnyWordSpec with Matchers with Helpers with TestHelpers with ApiBuilderServiceBuilders { diff --git a/src/test/scala/io/apibuilder/validation/MultiServiceSpec.scala b/src/test/scala/io/apibuilder/validation/MultiServiceSpec.scala index bed2af7..4a56004 100644 --- a/src/test/scala/io/apibuilder/validation/MultiServiceSpec.scala +++ b/src/test/scala/io/apibuilder/validation/MultiServiceSpec.scala @@ -3,7 +3,7 @@ package io.apibuilder.validation import io.apibuilder.builders.ApiBuilderServiceBuilders import io.apibuilder.helpers.{Helpers, TestHelpers} import io.apibuilder.spec.v0.models.{Method, ResponseCodeInt, Operation} -import play.api.libs.json.* +import play.api.libs.json._ import org.scalatest.matchers.must.Matchers import org.scalatest.wordspec.AnyWordSpec diff --git a/src/test/scala/io/apibuilder/validation/MultiServiceZipSpec.scala b/src/test/scala/io/apibuilder/validation/MultiServiceZipSpec.scala index 37f5f35..3db5bf8 100644 --- a/src/test/scala/io/apibuilder/validation/MultiServiceZipSpec.scala +++ b/src/test/scala/io/apibuilder/validation/MultiServiceZipSpec.scala @@ -2,11 +2,11 @@ package io.apibuilder.validation import java.io.File import io.apibuilder.builders.ApiBuilderServiceBuilders -import io.apibuilder.spec.v0.models.json.* +import io.apibuilder.spec.v0.models.json._ import io.apibuilder.spec.v0.models.{Method, Service} import io.apibuilder.validation.zip.ZipFileBuilder -import io.apibuilder.helpers.* -import play.api.libs.json.* +import io.apibuilder.helpers._ +import play.api.libs.json._ import org.scalatest.matchers.must.Matchers import org.scalatest.wordspec.AnyWordSpec diff --git a/src/test/scala/io/apibuilder/validation/ServiceOperationResolverSpec.scala b/src/test/scala/io/apibuilder/validation/ServiceOperationResolverSpec.scala index 2459093..9b48298 100644 --- a/src/test/scala/io/apibuilder/validation/ServiceOperationResolverSpec.scala +++ b/src/test/scala/io/apibuilder/validation/ServiceOperationResolverSpec.scala @@ -3,8 +3,8 @@ package io.apibuilder.validation import org.scalatest.matchers.must.Matchers import org.scalatest.wordspec.AnyWordSpec import io.apibuilder.builders.ApiBuilderServiceBuilders -import io.apibuilder.spec.v0.models.json.* -import io.apibuilder.helpers.* +import io.apibuilder.spec.v0.models.json._ +import io.apibuilder.helpers._ import io.apibuilder.spec.v0.models.Method import io.apibuilder.validation.zip.ZipFileBuilder import play.api.libs.json.Json diff --git a/src/test/scala/io/apibuilder/validation/Validator.scala b/src/test/scala/io/apibuilder/validation/Validator.scala index ffe78a4..029dc84 100644 --- a/src/test/scala/io/apibuilder/validation/Validator.scala +++ b/src/test/scala/io/apibuilder/validation/Validator.scala @@ -10,7 +10,7 @@ import cats.implicits._ import io.apibuilder.spec.v0.models.Service import play.api.libs.json.{JsArray, JsBoolean, JsValue, Json} import io.apibuilder.spec.v0.models.json._ -import org.apache.commons.compress.utils.IOUtils +import org.apache.commons.io.IOUtils import scala.concurrent.{Await, Future} import scala.concurrent.duration._ diff --git a/src/test/scala/io/apibuilder/validation/util/UrlDownloaderSpec.scala b/src/test/scala/io/apibuilder/validation/util/UrlDownloaderSpec.scala index 00dc079..335e637 100644 --- a/src/test/scala/io/apibuilder/validation/util/UrlDownloaderSpec.scala +++ b/src/test/scala/io/apibuilder/validation/util/UrlDownloaderSpec.scala @@ -1,6 +1,6 @@ package io.apibuilder.validation.util -import cats.implicits.* +import cats.implicits._ import io.apibuilder.helpers.{FileHelpers, TestHelpers} import org.scalatest.matchers.must.Matchers import org.scalatest.wordspec.AnyWordSpec diff --git a/src/test/scala/io/apibuilder/validation/util/ValidatedUrlDownloaderSpec.scala b/src/test/scala/io/apibuilder/validation/util/ValidatedUrlDownloaderSpec.scala index 4dbf834..fddc4f1 100644 --- a/src/test/scala/io/apibuilder/validation/util/ValidatedUrlDownloaderSpec.scala +++ b/src/test/scala/io/apibuilder/validation/util/ValidatedUrlDownloaderSpec.scala @@ -2,7 +2,7 @@ package io.apibuilder.validation.util import cats.data.NonEmptyChain import cats.data.Validated.{Invalid, Valid} -import cats.implicits.* +import cats.implicits._ import io.apibuilder.helpers.FileHelpers import org.scalatest.matchers.must.Matchers import org.scalatest.wordspec.AnyWordSpec From 80a5dbeed381234228b25208fe8eb2cc3f0fdfaa Mon Sep 17 00:00:00 2001 From: Jack Lynch Date: Fri, 10 Jan 2025 15:33:37 +0000 Subject: [PATCH 2/2] cleanup --- build.sbt | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/build.sbt b/build.sbt index 1db2126..8b4bb54 100644 --- a/build.sbt +++ b/build.sbt @@ -15,9 +15,9 @@ lazy val allScalacOptions = Seq( "-deprecation" ) + lazy val resolversSettings = Seq( -// resolvers += "jitpack" at "https://jitpack.io", - resolvers += "Artifactory" at "https://flow.jfrog.io/flow/libs-release/", + resolvers += "jitpack" at "https://jitpack.io", ) lazy val root = project @@ -26,7 +26,7 @@ lazy val root = project .settings( testOptions += Tests.Argument("-oF"), libraryDependencies ++= Seq( - "io.apibuilder" %% "apibuilder-commons" % "0.1.3", + "com.github.apicollective" % "apibuilder-commons" % (if (scalaVersion.value.startsWith("3")) "0.1.0" else "0.0.6"), "com.typesafe.play" %% "play-json" % (if (scalaVersion.value.startsWith("3")) "2.10.6" else "2.9.4"), "com.typesafe.play" %% "play-json-joda" % (if (scalaVersion.value.startsWith("3")) "2.10.6" else "2.9.4"), "org.apache.commons" % "commons-compress" % "1.26.2", @@ -37,13 +37,5 @@ lazy val root = project crossScalaVersions := supportedScalaVersions, ) -publishTo := { - val host = "https://flow.jfrog.io/flow" - if (isSnapshot.value) { - Some("Artifactory Realm" at s"$host/libs-snapshot-local;build.timestamp=" + new java.util.Date().getTime) - } else { - Some("Artifactory Realm" at s"$host/libs-release-local") - } -} version := "0.5.2"