From 4ec7d98b58544a538d348a302f29ba025c1b8661 Mon Sep 17 00:00:00 2001 From: Tim Steinbach Date: Sun, 5 May 2019 12:38:30 -0400 Subject: [PATCH] Switch to Circle CI --- .circleci/config.yml | 90 ++++++++++++++++++ .scalafmt.conf | 14 +++ .travis.yml | 5 - build.sbt | 144 +++++++++++++++-------------- project/plugins.sbt | 4 +- sonatype.sbt | 6 -- src/main/scala/ImplicitSerde.scala | 18 ++-- src/test/scala/Spec.scala | 8 +- 8 files changed, 197 insertions(+), 92 deletions(-) create mode 100644 .circleci/config.yml create mode 100644 .scalafmt.conf delete mode 100644 .travis.yml delete mode 100644 sonatype.sbt diff --git a/.circleci/config.yml b/.circleci/config.yml new file mode 100644 index 0000000..d694e65 --- /dev/null +++ b/.circleci/config.yml @@ -0,0 +1,90 @@ +version: 2 +jobs: + lint212_jdk8: + docker: + - image: hseeberger/scala-sbt:8u181_2.12.8_1.2.8 + steps: + - checkout + - restore_cache: + key: sbt-cache + - run: sbt ++2.12.8! scalafmtCheck test:scalafmtCheck scalafmtSbtCheck + - save_cache: + key: sbt-cache + paths: + - "~/.ivy2/cache" + - "~/.sbt" + - "~/.m2" + lint212_jdk11: + docker: + - image: hseeberger/scala-sbt:11.0.2_2.12.8_1.2.8 + steps: + - checkout + - restore_cache: + key: sbt-cache + - run: sbt ++2.12.8! scalafmtCheck test:scalafmtCheck scalafmtSbtCheck + - save_cache: + key: sbt-cache + paths: + - "~/.ivy2/cache" + - "~/.sbt" + - "~/.m2" + test212_jdk8: + docker: + - image: hseeberger/scala-sbt:8u181_2.12.8_1.2.8 + steps: + - checkout + - restore_cache: + key: sbt-cache + - run: sbt ++2.12.8! test + - save_cache: + key: sbt-cache + paths: + - "~/.ivy2/cache" + - "~/.sbt" + - "~/.m2" + test212_jdk11: + docker: + - image: hseeberger/scala-sbt:11.0.2_2.12.8_1.2.8 + steps: + - checkout + - restore_cache: + key: sbt-cache + - run: sbt ++2.12.8! test + - save_cache: + key: sbt-cache + paths: + - "~/.ivy2/cache" + - "~/.sbt" + - "~/.m2" + release: + docker: + - image: hseeberger/scala-sbt:8u181_2.12.8_1.2.8 + steps: + - checkout + - run: git fetch --tags + - restore_cache: + key: sbt-cache + - run: echo -n "${PGP_PUBLIC}" | base64 -d > /tmp/public.asc + - run: echo -n "${PGP_SECRET}" | base64 -d > /tmp/secret.asc + - run: sbt releaseEarly + +workflows: + version: 2 + build: + jobs: + - lint212_jdk8 + - lint212_jdk11 + - test212_jdk8: + requires: + - lint212_jdk8 + - test212_jdk11: + requires: + - lint212_jdk11 + - release: + context: Sonatype + requires: + - test212_jdk8 + - test212_jdk11 + filters: + tags: + only: /.*/ diff --git a/.scalafmt.conf b/.scalafmt.conf new file mode 100644 index 0000000..095b031 --- /dev/null +++ b/.scalafmt.conf @@ -0,0 +1,14 @@ +maxColumn = 120 +align = most +continuationIndent.defnSite = 2 +assumeStandardLibraryStripMargin = true +docstrings = JavaDoc +lineEndings = preserve +includeCurlyBraceInSelectChains = false +danglingParentheses = true +spaces { + inImportCurlyBraces = true +} +optIn.annotationNewlines = true + +rewrite.rules = [SortImports, RedundantBraces] diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index a09b861..0000000 --- a/.travis.yml +++ /dev/null @@ -1,5 +0,0 @@ -language: scala -scala: - - 2.11.12 - - 2.12.8 -jdk: oraclejdk8 diff --git a/build.sbt b/build.sbt index af148ea..3f9a1a5 100644 --- a/build.sbt +++ b/build.sbt @@ -1,91 +1,97 @@ -scalaVersion := "2.12.8" -crossScalaVersions := Seq("2.11.12", "2.12.8") +val mainScala = "2.12.8" + +scalaVersion := mainScala +crossScalaVersions := Seq("2.11.12", mainScala) organization := "com.nequissimus" name := "circe-kafka" -version := "2.1.0" + +homepage := Some(url("http://nequissimus.com/")) +licenses := List("Apache-2.0" -> url("http://www.apache.org/licenses/LICENSE-2.0")) +developers := List( + Developer( + "NeQuissimus", + "Tim Steinbach", + "steinbach.tim@gmail.com", + url("http://nequissimus.com/") + ) +) + +pgpPublicRing := file("/tmp/public.asc") +pgpSecretRing := file("/tmp/secret.asc") +releaseEarlyWith := SonatypePublisher +scmInfo := Some( + ScmInfo(url("https://github.com/NeQuissimus/circe-kafka/"), "scm:git:git@github.com:NeQuissimus/circe-kafka.git") +) // https://tpolecat.github.io/2017/04/25/scalac-flags.html val scalac212Options = Seq( - "-Xlint:constant", // Evaluation of a constant arithmetic expression results in an error. - "-Ywarn-extra-implicit", // Warn when more than one implicit parameter section is defined. - "-Ywarn-unused:implicits", // Warn if an implicit parameter is unused. - "-Ywarn-unused:imports", // Warn if an import selector is not referenced. - "-Ywarn-unused:locals", // Warn if a local definition is unused. - "-Ywarn-unused:params", // Warn if a value parameter is unused. - "-Ywarn-unused:patvars", // Warn if a variable bound in a pattern is unused. - "-Ywarn-unused:privates", // Warn if a private member is unused. + "-Xlint:constant", // Evaluation of a constant arithmetic expression results in an error. + "-Ywarn-extra-implicit", // Warn when more than one implicit parameter section is defined. + "-Ywarn-unused:implicits", // Warn if an implicit parameter is unused. + "-Ywarn-unused:imports", // Warn if an import selector is not referenced. + "-Ywarn-unused:locals", // Warn if a local definition is unused. + "-Ywarn-unused:params", // Warn if a value parameter is unused. + "-Ywarn-unused:patvars", // Warn if a variable bound in a pattern is unused. + "-Ywarn-unused:privates" // Warn if a private member is unused. ) val scalac211Options = Seq( - "-deprecation", // Emit warning and location for usages of deprecated APIs. - "-encoding", "utf-8", // Specify character encoding used by source files. - "-explaintypes", // Explain type errors in more detail. - "-feature", // Emit warning and location for usages of features that should be imported explicitly. - "-language:existentials", // Existential types (besides wildcard types) can be written and inferred - "-language:experimental.macros", // Allow macro definition (besides implementation and application) - "-language:higherKinds", // Allow higher-kinded types - "-language:implicitConversions", // Allow definition of implicit functions called views - "-unchecked", // Enable additional warnings where generated code depends on assumptions. - "-Xcheckinit", // Wrap field accessors to throw an exception on uninitialized access. - "-Xfatal-warnings", // Fail the compilation if there are any warnings. - "-Xfuture", // Turn on future language features. - "-Xlint:adapted-args", // Warn if an argument list is modified to match the receiver. - "-Xlint:by-name-right-associative", // By-name parameter of right associative operator. - "-Xlint:delayedinit-select", // Selecting member of DelayedInit. - "-Xlint:doc-detached", // A Scaladoc comment appears to be detached from its element. - "-Xlint:inaccessible", // Warn about inaccessible types in method signatures. - "-Xlint:infer-any", // Warn when a type argument is inferred to be `Any`. - "-Xlint:missing-interpolator", // A string literal appears to be missing an interpolator id. - "-Xlint:nullary-override", // Warn when non-nullary `def f()' overrides nullary `def f'. - "-Xlint:nullary-unit", // Warn when nullary methods return Unit. - "-Xlint:option-implicit", // Option.apply used implicit view. - "-Xlint:package-object-classes", // Class or object defined in package object. - "-Xlint:poly-implicit-overload", // Parameterized overloaded implicit methods are not visible as view bounds. - "-Xlint:private-shadow", // A private field (or class parameter) shadows a superclass field. - "-Xlint:stars-align", // Pattern sequence wildcard must align with sequence component. - "-Xlint:type-parameter-shadow", // A local type parameter shadows a type already in scope. - "-Xlint:unsound-match", // Pattern match may not be typesafe. - "-Yno-adapted-args", // Do not adapt an argument list (either by inserting () or creating a tuple) to match the receiver. - "-Ypartial-unification", // Enable partial unification in type constructor inference - "-Ywarn-dead-code", // Warn when dead code is identified. - "-Ywarn-inaccessible", // Warn about inaccessible types in method signatures. - "-Ywarn-infer-any", // Warn when a type argument is inferred to be `Any`. - "-Ywarn-nullary-override", // Warn when non-nullary `def f()' overrides nullary `def f'. - "-Ywarn-nullary-unit", // Warn when nullary methods return Unit. - "-Ywarn-numeric-widen", // Warn when numerics are widened. - "-Ywarn-value-discard" // Warn when non-Unit expression results are unused. + "-deprecation", // Emit warning and location for usages of deprecated APIs. + "-encoding", + "utf-8", // Specify character encoding used by source files. + "-explaintypes", // Explain type errors in more detail. + "-feature", // Emit warning and location for usages of features that should be imported explicitly. + "-language:existentials", // Existential types (besides wildcard types) can be written and inferred + "-language:experimental.macros", // Allow macro definition (besides implementation and application) + "-language:higherKinds", // Allow higher-kinded types + "-language:implicitConversions", // Allow definition of implicit functions called views + "-unchecked", // Enable additional warnings where generated code depends on assumptions. + "-Xcheckinit", // Wrap field accessors to throw an exception on uninitialized access. + "-Xfatal-warnings", // Fail the compilation if there are any warnings. + "-Xfuture", // Turn on future language features. + "-Xlint:adapted-args", // Warn if an argument list is modified to match the receiver. + "-Xlint:by-name-right-associative", // By-name parameter of right associative operator. + "-Xlint:delayedinit-select", // Selecting member of DelayedInit. + "-Xlint:doc-detached", // A Scaladoc comment appears to be detached from its element. + "-Xlint:inaccessible", // Warn about inaccessible types in method signatures. + "-Xlint:infer-any", // Warn when a type argument is inferred to be `Any`. + "-Xlint:missing-interpolator", // A string literal appears to be missing an interpolator id. + "-Xlint:nullary-override", // Warn when non-nullary `def f()' overrides nullary `def f'. + "-Xlint:nullary-unit", // Warn when nullary methods return Unit. + "-Xlint:option-implicit", // Option.apply used implicit view. + "-Xlint:package-object-classes", // Class or object defined in package object. + "-Xlint:poly-implicit-overload", // Parameterized overloaded implicit methods are not visible as view bounds. + "-Xlint:private-shadow", // A private field (or class parameter) shadows a superclass field. + "-Xlint:stars-align", // Pattern sequence wildcard must align with sequence component. + "-Xlint:type-parameter-shadow", // A local type parameter shadows a type already in scope. + "-Xlint:unsound-match", // Pattern match may not be typesafe. + "-Yno-adapted-args", // Do not adapt an argument list (either by inserting () or creating a tuple) to match the receiver. + "-Ypartial-unification", // Enable partial unification in type constructor inference + "-Ywarn-dead-code", // Warn when dead code is identified. + "-Ywarn-inaccessible", // Warn about inaccessible types in method signatures. + "-Ywarn-infer-any", // Warn when a type argument is inferred to be `Any`. + "-Ywarn-nullary-override", // Warn when non-nullary `def f()' overrides nullary `def f'. + "-Ywarn-nullary-unit", // Warn when nullary methods return Unit. + "-Ywarn-numeric-widen", // Warn when numerics are widened. + "-Ywarn-value-discard" // Warn when non-Unit expression results are unused. ) scalacOptions := (CrossVersion.partialVersion(scalaBinaryVersion.value) match { case Some((2, v)) if v == 11 => scalac211Options - case _ => scalac211Options ++ scalac212Options + case _ => scalac211Options ++ scalac212Options }) libraryDependencies ++= Seq( - "io.circe" %% "circe-core" % "0.11.1", - "io.circe" %% "circe-generic" % "0.11.1" % Test, - "io.circe" %% "circe-parser" % "0.11.1", - "org.apache.kafka" % "kafka-clients" % "2.2.0", + "io.circe" %% "circe-core" % "0.11.1", + "io.circe" %% "circe-generic" % "0.11.1" % Test, + "io.circe" %% "circe-parser" % "0.11.1", + "org.apache.kafka" % "kafka-clients" % "2.2.0", compilerPlugin("com.github.ghik" %% "silencer-plugin" % "1.3.3"), "com.github.ghik" %% "silencer-lib" % "1.3.3", - "com.lihaoyi" %% "utest" % "0.6.7" % Test + "com.lihaoyi" %% "utest" % "0.6.7" % Test ) testFrameworks += new TestFramework("utest.runner.Framework") -useGpg := false - -isSnapshot := version.value endsWith "SNAPSHOT" - -publishTo := Some( - if (isSnapshot.value) - Opts.resolver.sonatypeSnapshots - else - Opts.resolver.sonatypeStaging -) - -usePgpKeyHex("E8C4928416101E9F") -pgpPublicRing := baseDirectory.value / "project" / ".gnupg" / "pubring.gpg" -pgpSecretRing := baseDirectory.value / "project" / ".gnupg" / "secring.gpg" -pgpPassphrase := sys.env.get("PGP_PASS").map(_.toArray) +addCommandAlias("format", "all scalafmtSbt scalafmt test:scalafmt") diff --git a/project/plugins.sbt b/project/plugins.sbt index 9f7248c..312fe91 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -1,2 +1,2 @@ -addSbtPlugin("org.xerial.sbt" % "sbt-sonatype" % "2.3") -addSbtPlugin("com.jsuereth" % "sbt-pgp" % "1.1.2") +addSbtPlugin("ch.epfl.scala" % "sbt-release-early" % "2.1.1") +addSbtPlugin("com.geirsson" % "sbt-scalafmt" % "1.5.1") diff --git a/sonatype.sbt b/sonatype.sbt deleted file mode 100644 index 82219c0..0000000 --- a/sonatype.sbt +++ /dev/null @@ -1,6 +0,0 @@ -publishMavenStyle := true - -licenses := Seq("APL2" -> url("http://www.apache.org/licenses/LICENSE-2.0.txt")) - -import xerial.sbt.Sonatype._ -sonatypeProjectHosting := Some(GitHubHosting("NeQuissimus", "circe-kafka", "steinbach.tim@gmail.com")) diff --git a/src/main/scala/ImplicitSerde.scala b/src/main/scala/ImplicitSerde.scala index 3ae4991..6277f3f 100644 --- a/src/main/scala/ImplicitSerde.scala +++ b/src/main/scala/ImplicitSerde.scala @@ -16,17 +16,23 @@ package object kafka { implicit def encoder2serializer[T <: AnyRef](implicit encoder: Encoder[T]): Serializer[T] = new Serializer[T] { def close(): Unit = {} @silent def configure(configs: JMap[String, _], isKey: Boolean): Unit = {} - def serialize(topic: String, data: T): Array[Byte] = if (data eq null) null.asInstanceOf[Array[Byte]] else - stringSerde.serializer.serialize(topic, encoder(data).noSpaces) + def serialize(topic: String, data: T): Array[Byte] = + if (data eq null) null.asInstanceOf[Array[Byte]] + else + stringSerde.serializer.serialize(topic, encoder(data).noSpaces) } implicit def decoder2deserializer[T <: AnyRef](implicit decoder: Decoder[T]): Deserializer[T] = new Deserializer[T] { def close(): Unit = {} @silent def configure(config: JMap[String, _], isKey: Boolean): Unit = {} - def deserialize(topic: String, data: Array[Byte]): T = if (data eq null) null.asInstanceOf[T] else { - decode[T](new String(data)).fold(error => throw new SerializationException(error), identity) - } + def deserialize(topic: String, data: Array[Byte]): T = + if (data eq null) null.asInstanceOf[T] + else { + decode[T](new String(data)).fold(error => throw new SerializationException(error), identity) + } } - implicit def serializerdeserializer2serde[T <: AnyRef](implicit serializer: Serializer[T], deserializer: Deserializer[T]): Serde[T] = Serdes.serdeFrom(serializer, deserializer) + implicit def serializerdeserializer2serde[T <: AnyRef](implicit serializer: Serializer[T], + deserializer: Deserializer[T]): Serde[T] = + Serdes.serdeFrom(serializer, deserializer) } diff --git a/src/test/scala/Spec.scala b/src/test/scala/Spec.scala index 938b56c..a24694b 100644 --- a/src/test/scala/Spec.scala +++ b/src/test/scala/Spec.scala @@ -19,15 +19,15 @@ object KafkaSpec extends TestSuite { ser } "Create a Deserializer from a Decoder" - { - val dec: Decoder[Foo] = implicitly[Decoder[Foo]] + val dec: Decoder[Foo] = implicitly[Decoder[Foo]] val des: Deserializer[Foo] = kafka.decoder2deserializer(dec) des } "Create a Serde from Encoder and Decoder" - { - val enc: Encoder[Foo] = implicitly - val dec: Decoder[Foo] = implicitly - val ser: Serializer[Foo] = kafka.encoder2serializer(enc) + val enc: Encoder[Foo] = implicitly + val dec: Decoder[Foo] = implicitly + val ser: Serializer[Foo] = kafka.encoder2serializer(enc) val des: Deserializer[Foo] = kafka.decoder2deserializer(dec) val serde: Serde[Foo] = kafka.serializerdeserializer2serde(ser, des)