From 2ea4b1cda88709ac53e75a8c1e48a7870f56fb92 Mon Sep 17 00:00:00 2001 From: Olafur Pall Geirsson Date: Sat, 18 Apr 2020 12:21:56 +0000 Subject: [PATCH 1/2] Refactor the build for consistency with other Scalameta builds * tests live in `tests` project * enable Scalafix `ExplicitResultTypes` and `RemoveUnused` rules * enforce scalafmt and scalafix in CI * use MUnit for ScalaCheck property tests * use `*Suite` suffix for test suites --- .github/workflows/ci.yml | 7 + .scalafix.conf | 6 + scalafmt => bin/scalafmt | Bin build.sbt | 121 +++++++++--------- .../test/scala/metaconfig/CodecProps.scala | 36 ------ .../src/test/scala/metaconfig/cli/Site.scala | 16 --- .../src/main/scala/metaconfig/Conf.scala | 4 +- .../src/main/scala/metaconfig/ConfCodec.scala | 2 - .../main/scala/metaconfig/ConfDecoder.scala | 1 - .../src/main/scala/metaconfig/Input.scala | 8 +- .../src/main/scala/metaconfig/Position.scala | 2 +- .../main/scala/metaconfig/cli/CliApp.scala | 3 - .../main/scala/metaconfig/cli/Command.scala | 3 - .../scala/metaconfig/cli/HelpCommand.scala | 15 +-- .../scala/metaconfig/cli/HelpOptions.scala | 8 +- .../main/scala/metaconfig/cli/Messages.scala | 3 - .../metaconfig/cli/TabCompleteCommand.scala | 5 - .../metaconfig/cli/TabCompleteOptions.scala | 3 +- .../scala/metaconfig/cli/VersionCommand.scala | 3 - .../scala/metaconfig/internal/CliParser.scala | 1 - .../scala/metaconfig/internal/Macros.scala | 2 - .../metaconfig/internal/JsonConfParser.scala | 2 +- .../scala/metaconfig/sconfig/PatchProps.scala | 58 --------- .../scala/metaconfig/sconfig/package.scala | 15 ++- .../{ => jvm}/src/main/graal/reflection.json | 0 .../scala/metaconfig/cli/Markdownish.scala | 28 ++++ .../main}/scala/metaconfig/cli/Options.scala | 5 +- .../src/main/scala/metaconfig/cli/Site.scala | 13 ++ .../scala/metaconfig/tests/ExampleMain.scala | 9 +- .../metaconfig/CodecRoundtripSuite.scala | 26 ++++ .../scala/metaconfig/HoconPrinterSuite.scala | 0 .../jvm/src/test/scala/metaconfig/Inner.scala | 9 ++ .../scala/metaconfig/JsonSchemaSuite.scala | 14 +- .../jvm/src/test/scala/metaconfig/Outer.scala | 9 ++ .../test/scala/metaconfig/PatchSuite.scala | 0 .../metaconfig/cli/BaseCliParserSuite.scala | 5 +- .../test/scala/metaconfig/cli/CaseSuite.scala | 0 .../scala/metaconfig/cli/CliParserSuite.scala | 4 - .../test/scala/metaconfig/cli/CliSuite.scala | 28 ---- .../metaconfig/cli/SubcommandSuite.scala | 19 ++- .../metaconfig/cli/TabCompletionSuite.scala | 3 +- .../internal/JsonConfErrorSuite.scala | 0 .../internal/JsonConfParserSuite.scala | 0 .../sconfig/HoconPrinterRoundtripSuite.scala | 33 ++--- .../sconfig/SConfig2ClassSuite.scala | 2 +- .../sconfig/SconfigPropertySuite.scala | 41 ++++++ .../HoconPrinterRoundtripSuite.scala | 33 ++--- .../TypesafeConfig2ClassSuite.scala | 2 +- .../TypesafeConfigPropertySuite.scala | 42 ++++++ .../scala/metaconfig/AllTheAnnotations.scala | 28 ++-- .../main}/scala/metaconfig/Generators.scala | 6 +- .../scala/metaconfig/ConfDynamicSuite.scala | 4 +- .../scala/metaconfig/ConfErrorSuite.scala | 0 .../scala/metaconfig/ConfOptionSuite.scala | 2 +- .../metaconfig/DeriveConfCodecSuite.scala | 0 .../metaconfig/DeriveConfDecoderSuite.scala | 3 - .../metaconfig/DeriveConfEncoderSuite.scala | 0 .../scala/metaconfig/DeriveSurfaceSuite.scala | 9 +- .../test/scala/metaconfig/EqualitySuite.scala | 0 .../test/scala/metaconfig/SettingsSuite.scala | 0 .../metaconfig/typesafeconfig/package.scala | 15 ++- .../typesafeconfig/PatchProps.scala | 56 -------- project/plugins.sbt | 3 +- 63 files changed, 352 insertions(+), 423 deletions(-) create mode 100644 .scalafix.conf rename scalafmt => bin/scalafmt (100%) delete mode 100644 metaconfig-core/jvm/src/test/scala/metaconfig/CodecProps.scala delete mode 100644 metaconfig-core/jvm/src/test/scala/metaconfig/cli/Site.scala delete mode 100644 metaconfig-sconfig/jvm/src/test/scala/metaconfig/sconfig/PatchProps.scala rename metaconfig-tests/{ => jvm}/src/main/graal/reflection.json (100%) create mode 100644 metaconfig-tests/jvm/src/main/scala/metaconfig/cli/Markdownish.scala rename {metaconfig-core/jvm/src/test => metaconfig-tests/jvm/src/main}/scala/metaconfig/cli/Options.scala (92%) create mode 100644 metaconfig-tests/jvm/src/main/scala/metaconfig/cli/Site.scala rename metaconfig-tests/{ => jvm}/src/main/scala/metaconfig/tests/ExampleMain.scala (84%) create mode 100644 metaconfig-tests/jvm/src/test/scala/metaconfig/CodecRoundtripSuite.scala rename {metaconfig-core => metaconfig-tests}/jvm/src/test/scala/metaconfig/HoconPrinterSuite.scala (100%) create mode 100644 metaconfig-tests/jvm/src/test/scala/metaconfig/Inner.scala rename {metaconfig-json => metaconfig-tests/jvm}/src/test/scala/metaconfig/JsonSchemaSuite.scala (85%) create mode 100644 metaconfig-tests/jvm/src/test/scala/metaconfig/Outer.scala rename {metaconfig-core => metaconfig-tests}/jvm/src/test/scala/metaconfig/PatchSuite.scala (100%) rename {metaconfig-core => metaconfig-tests}/jvm/src/test/scala/metaconfig/cli/BaseCliParserSuite.scala (91%) rename {metaconfig-core => metaconfig-tests}/jvm/src/test/scala/metaconfig/cli/CaseSuite.scala (100%) rename {metaconfig-core => metaconfig-tests}/jvm/src/test/scala/metaconfig/cli/CliParserSuite.scala (97%) rename {metaconfig-core => metaconfig-tests}/jvm/src/test/scala/metaconfig/cli/CliSuite.scala (71%) rename {metaconfig-core => metaconfig-tests}/jvm/src/test/scala/metaconfig/cli/SubcommandSuite.scala (89%) rename {metaconfig-core => metaconfig-tests}/jvm/src/test/scala/metaconfig/cli/TabCompletionSuite.scala (97%) rename {metaconfig-json => metaconfig-tests/jvm}/src/test/scala/metaconfig/internal/JsonConfErrorSuite.scala (100%) rename {metaconfig-json => metaconfig-tests/jvm}/src/test/scala/metaconfig/internal/JsonConfParserSuite.scala (100%) rename metaconfig-sconfig/jvm/src/test/scala/metaconfig/sconfig/HoconPrinterProps.scala => metaconfig-tests/jvm/src/test/scala/metaconfig/sconfig/HoconPrinterRoundtripSuite.scala (51%) rename metaconfig-sconfig/jvm/src/test/scala/metaconfig/sconfig/SConfig2ClassTest.scala => metaconfig-tests/jvm/src/test/scala/metaconfig/sconfig/SConfig2ClassSuite.scala (95%) create mode 100644 metaconfig-tests/jvm/src/test/scala/metaconfig/sconfig/SconfigPropertySuite.scala rename metaconfig-typesafe-config/src/test/scala/metaconfig/typesafeconfig/HoconPrinterProps.scala => metaconfig-tests/jvm/src/test/scala/metaconfig/typesafeconfig/HoconPrinterRoundtripSuite.scala (51%) rename metaconfig-typesafe-config/src/test/scala/metaconfig/typesafeconfig/TypesafeConfig2ClassTest.scala => metaconfig-tests/jvm/src/test/scala/metaconfig/typesafeconfig/TypesafeConfig2ClassSuite.scala (95%) create mode 100644 metaconfig-tests/jvm/src/test/scala/metaconfig/typesafeconfig/TypesafeConfigPropertySuite.scala rename {metaconfig-core/shared/src/test => metaconfig-tests/shared/src/main}/scala/metaconfig/AllTheAnnotations.scala (69%) rename {metaconfig-core/shared/src/test => metaconfig-tests/shared/src/main}/scala/metaconfig/Generators.scala (88%) rename metaconfig-core/shared/src/test/scala/metaconfig/ConfDynamicTest.scala => metaconfig-tests/shared/src/test/scala/metaconfig/ConfDynamicSuite.scala (87%) rename {metaconfig-core => metaconfig-tests}/shared/src/test/scala/metaconfig/ConfErrorSuite.scala (100%) rename metaconfig-core/shared/src/test/scala/metaconfig/ConfOptionTest.scala => metaconfig-tests/shared/src/test/scala/metaconfig/ConfOptionSuite.scala (92%) rename {metaconfig-core => metaconfig-tests}/shared/src/test/scala/metaconfig/DeriveConfCodecSuite.scala (100%) rename {metaconfig-core => metaconfig-tests}/shared/src/test/scala/metaconfig/DeriveConfDecoderSuite.scala (96%) rename {metaconfig-core => metaconfig-tests}/shared/src/test/scala/metaconfig/DeriveConfEncoderSuite.scala (100%) rename {metaconfig-core => metaconfig-tests}/shared/src/test/scala/metaconfig/DeriveSurfaceSuite.scala (92%) rename {metaconfig-core => metaconfig-tests}/shared/src/test/scala/metaconfig/EqualitySuite.scala (100%) rename {metaconfig-core => metaconfig-tests}/shared/src/test/scala/metaconfig/SettingsSuite.scala (100%) delete mode 100644 metaconfig-typesafe-config/src/test/scala/metaconfig/typesafeconfig/PatchProps.scala diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fc49c1bb..20b16d78 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,3 +21,10 @@ jobs: - uses: olafurpg/setup-scala@v2 - name: Test run: sbt +test + checks: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: olafurpg/setup-scala@v7 + - run: ./bin/scalafmt --check + - run: sbt scalafixCheckAll diff --git a/.scalafix.conf b/.scalafix.conf new file mode 100644 index 00000000..6d486e27 --- /dev/null +++ b/.scalafix.conf @@ -0,0 +1,6 @@ +rules = [ + RemoveUnused, + ExplicitResultTypes, +] + +ExplicitResultTypes.rewriteStructuralTypesToNamedSubclass = false diff --git a/scalafmt b/bin/scalafmt similarity index 100% rename from scalafmt rename to bin/scalafmt diff --git a/build.sbt b/build.sbt index 9b0a5d35..9c853a0c 100644 --- a/build.sbt +++ b/build.sbt @@ -1,7 +1,10 @@ import java.util.Date import sbtcrossproject.CrossPlugin.autoImport.crossProject +lazy val V = new { + def munit = "0.7.2" +} val scala211 = "2.11.12" -val scala212 = "2.12.10" +val scala212 = "2.12.11" val scala213 = "2.13.1" val ScalaVersions = List(scala212, scala211, scala213) inThisBuild( @@ -31,6 +34,15 @@ inThisBuild( ) ) +addCommandAlias( + "scalafixAll", + s"; ++$scala212 ; scalafixEnable ; all scalafix test:scalafix" +) +addCommandAlias( + "scalafixCheckAll", + s"; ++$scala212 ; scalafixEnable ; scalafix --check ; test:scalafix --check" +) + addCommandAlias( "native-image", "; tests/graalvm-native-image:packageBin ; taskready" @@ -41,55 +53,24 @@ commands += Command.command("taskready") { s => s } -lazy val testSettings = List( - testOptions.in(Test) += - Tests.Argument(TestFrameworks.ScalaCheck, "-verbosity", "2"), - testFrameworks := List( - new TestFramework("munit.Framework"), - new TestFramework("org.scalacheck.ScalaCheckFramework") - ), - libraryDependencies ++= { - if (SettingKey[Boolean]("nativeLinkStubs").?.value.contains(true)) - List( - "org.scalameta" %%% "munit" % "0.4.5" % Test, - "com.github.lolgab" %%% "scalacheck" % "1.14.1" % Test - ) - else - List( - "org.scalameta" %%% "munit" % "0.4.5" % Test, - "org.scalacheck" %%% "scalacheck" % "1.14.0" % Test, - "com.github.alexarchambault" %%% "scalacheck-shapeless_1.14" % "1.2.3" % Test - ) - } -) +lazy val warnUnusedImport = Def.setting { + if (scalaVersion.value.startsWith("2.13")) "-Wunused:imports" + else "-Ywarn-unused-import" +} -lazy val nativeSettings = List( - nativeLinkStubs := true, - scalaVersion := scala211, - crossScalaVersions := List(scala211), - test.in(Test) := {} +lazy val sharedSettings = List[Setting[_]]( + scalacOptions ++= List( + "-Yrangepos", + warnUnusedImport.value + ) ) skip.in(publish) := true -lazy val json = project - .in(file("metaconfig-json")) - .settings( - testSettings, - moduleName := "metaconfig-json", - libraryDependencies ++= List( - "org.scalameta" %% "testkit" % "4.1.12" % Test - ) :+ (CrossVersion.partialVersion(scalaVersion.value) match { - case Some((2, 11 | 12)) => "com.lihaoyi" %%% "upickle" % "0.7.4" - case _ => "com.lihaoyi" %% "upickle" % "0.7.5" - }) - ) - .dependsOn(coreJVM) - lazy val core = crossProject(JVMPlatform, JSPlatform) .in(file("metaconfig-core")) .settings( - testSettings, + sharedSettings, moduleName := "metaconfig-core", libraryDependencies ++= List( "org.typelevel" %%% "paiges-core" % "0.3.0", @@ -100,54 +81,67 @@ lazy val core = crossProject(JVMPlatform, JSPlatform) case _ => "com.lihaoyi" %%% "pprint" % "0.5.9" }) ) - .jsSettings(scalaJSModuleKind := ModuleKind.CommonJSModule) - // .nativeSettings(nativeSettings) - .jvmSettings( - libraryDependencies += "org.scalameta" %% "testkit" % "4.1.12" % Test - ) lazy val coreJVM = core.jvm lazy val coreJS = core.js -// lazy val coreNative = core.native -lazy val typesafeConfig = "com.typesafe" % "config" % "1.2.1" +lazy val json = project + .in(file("metaconfig-json")) + .settings( + sharedSettings, + moduleName := "metaconfig-json", + libraryDependencies ++= List( + (CrossVersion.partialVersion(scalaVersion.value) match { + case Some((2, 11 | 12)) => "com.lihaoyi" %%% "upickle" % "0.7.4" + case _ => "com.lihaoyi" %% "upickle" % "0.7.5" + }) + ) + ) + .dependsOn(coreJVM) lazy val typesafe = project .in(file("metaconfig-typesafe-config")) .settings( - testSettings, + sharedSettings, moduleName := "metaconfig-typesafe-config", description := "Integration for HOCON using typesafehub/config.", - libraryDependencies += typesafeConfig + libraryDependencies += "com.typesafe" % "config" % "1.2.1" ) - .dependsOn(coreJVM % "test->test;compile->compile") + .dependsOn(coreJVM) lazy val sconfig = crossProject(JVMPlatform) .in(file("metaconfig-sconfig")) .settings( - testSettings, + sharedSettings, moduleName := "metaconfig-sconfig", description := "Integration for HOCON using ekrich/sconfig.", libraryDependencies ++= List( "org.ekrich" %%% "sconfig" % "1.0.0" ) ) - // .nativeSettings(nativeSettings) - .dependsOn(core % "test->test;compile->compile") + .dependsOn(core) lazy val sconfigJVM = sconfig.jvm -// lazy val sconfigNative = sconfig.native val scalatagsVersion = Def.setting { if (scalaVersion.value.startsWith("2.11")) "0.6.7" else "0.7.0" } -lazy val tests = project +lazy val tests = crossProject(JVMPlatform, JSPlatform) .in(file("metaconfig-tests")) .settings( + sharedSettings, skip in publish := true, + publishArtifact.in(Compile, packageDoc) := false, + testFrameworks := List(new TestFramework("munit.Framework")), + libraryDependencies ++= List( + "org.scalameta" %%% "munit-scalacheck" % V.munit, + "com.github.alexarchambault" %%% "scalacheck-shapeless_1.14" % "1.2.3" + ) + ) + .jsSettings(scalaJSModuleKind := ModuleKind.CommonJSModule) + .jvmSettings( mainClass in GraalVMNativeImage := Some("metaconfig.tests.ExampleMain"), sources.in(Compile, doc) := Seq.empty, - publishArtifact.in(Compile, packageDoc) := false, graalVMNativeImageOptions ++= { val reflectionFile = Keys.sourceDirectory.in(Compile).value./("graal")./("reflection.json") @@ -168,10 +162,17 @@ lazy val tests = project ) } ) - .enablePlugins(GraalVMNativeImagePlugin) - .dependsOn(coreJVM) + .jvmConfigure( + _.enablePlugins(GraalVMNativeImagePlugin) + .dependsOn(json, typesafe, sconfigJVM) + ) + .dependsOn(core) +lazy val testsJVM = tests.jvm +lazy val testsJS = tests.js + lazy val docs = project .settings( + sharedSettings, moduleName := "metaconfig-docs", libraryDependencies ++= List( "com.lihaoyi" %% "scalatags" % scalatagsVersion.value diff --git a/metaconfig-core/jvm/src/test/scala/metaconfig/CodecProps.scala b/metaconfig-core/jvm/src/test/scala/metaconfig/CodecProps.scala deleted file mode 100644 index 70f3d163..00000000 --- a/metaconfig-core/jvm/src/test/scala/metaconfig/CodecProps.scala +++ /dev/null @@ -1,36 +0,0 @@ -package metaconfig - -import metaconfig.generic.Surface -import org.scalacheck.Prop.forAll -import org.scalacheck.Properties -import org.scalacheck.ScalacheckShapeless._ - -case class Inner(a: String = "a", b: Boolean = true) -object Inner { - implicit val surface: Surface[Inner] = generic.deriveSurface[Inner] - implicit val codec: ConfCodec[Inner] = generic.deriveCodec(Inner()) -} - -case class Outer(inner: Inner = Inner(), c: Int = 0) -object Outer { - implicit val surface: Surface[Outer] = generic.deriveSurface - implicit val codec: ConfCodec[Outer] = generic.deriveCodec(Outer()) -} - -class CodecProps extends Properties("Codec") { - - def checkRoundtrip[T: ConfCodec](a: T): Boolean = { - val conf = ConfEncoder[T].write(a) - val b = ConfDecoder[T].read(conf).get - a == b - } - - property("roundtrip AllTheAnnotations") = forAll { a: AllTheAnnotations => - checkRoundtrip(a) - } - - property("roundtrip Outer") = forAll { a: Outer => - checkRoundtrip(a) - } - -} diff --git a/metaconfig-core/jvm/src/test/scala/metaconfig/cli/Site.scala b/metaconfig-core/jvm/src/test/scala/metaconfig/cli/Site.scala deleted file mode 100644 index 17238b26..00000000 --- a/metaconfig-core/jvm/src/test/scala/metaconfig/cli/Site.scala +++ /dev/null @@ -1,16 +0,0 @@ -package metaconfig.cli - -import java.nio.file.Paths -import metaconfig.annotation._ -import metaconfig._ -import metaconfig.generic.Settings -import java.io.File - -case class Site( - foo: String = "foo", - custom: Map[String, String] = Map.empty -) -object Site { - implicit val surface = generic.deriveSurface[Site] - implicit val codec = generic.deriveCodec[Site](Site()) -} diff --git a/metaconfig-core/shared/src/main/scala/metaconfig/Conf.scala b/metaconfig-core/shared/src/main/scala/metaconfig/Conf.scala index 88cb7338..c529d432 100644 --- a/metaconfig-core/shared/src/main/scala/metaconfig/Conf.scala +++ b/metaconfig-core/shared/src/main/scala/metaconfig/Conf.scala @@ -9,8 +9,6 @@ import metaconfig.internal.CliParser import metaconfig.internal.ConfGet import metaconfig.internal.ConfPatch import metaconfig.internal.HoconPrinter -import org.typelevel.paiges.Doc -import metaconfig.generic.Surface sealed abstract class Conf extends Product with Serializable { def dynamic: ConfDynamic = ConfDynamic(Configured.Ok(this)) @@ -115,7 +113,7 @@ object Conf { .getOrElse(Configured.Ok(None)) } object Obj { - val empty = Obj() + val empty: Obj = Obj() def apply(values: (String, Conf)*): Obj = Obj(values.toList) } } diff --git a/metaconfig-core/shared/src/main/scala/metaconfig/ConfCodec.scala b/metaconfig-core/shared/src/main/scala/metaconfig/ConfCodec.scala index 13613893..1b14b95d 100644 --- a/metaconfig-core/shared/src/main/scala/metaconfig/ConfCodec.scala +++ b/metaconfig-core/shared/src/main/scala/metaconfig/ConfCodec.scala @@ -1,7 +1,5 @@ package metaconfig -import scala.language.higherKinds - trait ConfCodec[A] extends ConfDecoder[A] with ConfEncoder[A] { self => def bimap[B](in: B => A, out: A => B): ConfCodec[B] = new ConfCodec[B] { override def write(value: B): Conf = self.write(in(value)) diff --git a/metaconfig-core/shared/src/main/scala/metaconfig/ConfDecoder.scala b/metaconfig-core/shared/src/main/scala/metaconfig/ConfDecoder.scala index 03f39fb6..0ecb4e83 100644 --- a/metaconfig-core/shared/src/main/scala/metaconfig/ConfDecoder.scala +++ b/metaconfig-core/shared/src/main/scala/metaconfig/ConfDecoder.scala @@ -1,6 +1,5 @@ package metaconfig -import scala.language.experimental.macros import scala.language.higherKinds import scala.collection.compat._ import scala.reflect.ClassTag diff --git a/metaconfig-core/shared/src/main/scala/metaconfig/Input.scala b/metaconfig-core/shared/src/main/scala/metaconfig/Input.scala index 41786919..63259480 100644 --- a/metaconfig-core/shared/src/main/scala/metaconfig/Input.scala +++ b/metaconfig-core/shared/src/main/scala/metaconfig/Input.scala @@ -66,19 +66,21 @@ sealed abstract class Input(val path: String, val text: String) object Input { case object None extends Input("", "") { - override def toString = "Input.None" + override def toString: Predef.String = "Input.None" } final case class String(override val text: Predef.String) extends Input("", text) { - override def toString = s"""Input.String("$text")""" + override def toString: Predef.String = + s"""Input.String("$text")""" } final case class VirtualFile( override val path: Predef.String, override val text: Predef.String ) extends Input(path, text) { - override def toString = s"""Input.VirtualFile("$path", "...")""" + override def toString: Predef.String = + s"""Input.VirtualFile("$path", "...")""" } final case class File(file: Path, charset: Charset) diff --git a/metaconfig-core/shared/src/main/scala/metaconfig/Position.scala b/metaconfig-core/shared/src/main/scala/metaconfig/Position.scala index 36e272e9..ac0aa7d6 100644 --- a/metaconfig-core/shared/src/main/scala/metaconfig/Position.scala +++ b/metaconfig-core/shared/src/main/scala/metaconfig/Position.scala @@ -77,7 +77,7 @@ object Position { def endLine: Int = input.offsetToLine(end) def endColumn: Int = end - input.lineToOffset(endLine) override def text = new String(input.chars, start, end - start) - override def toString = s"[$start..$end) in $input" + override def toString: String = s"[$start..$end) in $input" } } diff --git a/metaconfig-core/shared/src/main/scala/metaconfig/cli/CliApp.scala b/metaconfig-core/shared/src/main/scala/metaconfig/cli/CliApp.scala index 7d221edb..809ac788 100644 --- a/metaconfig-core/shared/src/main/scala/metaconfig/cli/CliApp.scala +++ b/metaconfig-core/shared/src/main/scala/metaconfig/cli/CliApp.scala @@ -2,9 +2,6 @@ package metaconfig.cli import java.io.PrintStream import java.io.InputStream -import metaconfig.generic -import metaconfig.ConfEncoder -import metaconfig.generic.Surface import java.nio.file.Path import fansi.Str import fansi.Color diff --git a/metaconfig-core/shared/src/main/scala/metaconfig/cli/Command.scala b/metaconfig-core/shared/src/main/scala/metaconfig/cli/Command.scala index 8860d71e..85d3faef 100644 --- a/metaconfig-core/shared/src/main/scala/metaconfig/cli/Command.scala +++ b/metaconfig-core/shared/src/main/scala/metaconfig/cli/Command.scala @@ -1,11 +1,8 @@ package metaconfig.cli import java.io.PrintStream -import java.io.InputStream -import metaconfig.generic import metaconfig.ConfEncoder import metaconfig.generic.Surface -import java.nio.file.Path import org.typelevel.paiges.Doc import java.io.ByteArrayOutputStream import java.nio.charset.StandardCharsets diff --git a/metaconfig-core/shared/src/main/scala/metaconfig/cli/HelpCommand.scala b/metaconfig-core/shared/src/main/scala/metaconfig/cli/HelpCommand.scala index 925f3dc9..15695f19 100644 --- a/metaconfig-core/shared/src/main/scala/metaconfig/cli/HelpCommand.scala +++ b/metaconfig-core/shared/src/main/scala/metaconfig/cli/HelpCommand.scala @@ -1,20 +1,7 @@ package metaconfig.cli -import metaconfig.generic.Field -import metaconfig.generic.Surface -import metaconfig.ConfEncoder -import metaconfig.Conf import org.typelevel.paiges.Doc -import scala.util.control.NonFatal -import metaconfig.Conf.Str -import java.io.PrintStream -import java.io.ByteArrayOutputStream -import java.nio.charset.StandardCharsets import metaconfig.internal.TermInfo -import metaconfig.annotation.ExtraName -import metaconfig.ConfDecoder -import metaconfig.Configured -import metaconfig.Conf.Obj import metaconfig.internal.Levenshtein object HelpCommand @@ -30,7 +17,7 @@ class HelpCommand( appDescription: CliApp => Doc, appExamples: CliApp => Doc ) extends Command[HelpOptions]("help") { - override def description = Doc.paragraph("Print this help message") + override def description: Doc = Doc.paragraph("Print this help message") override def extraNames: List[String] = List("-h", "--help", "-help") override def complete( context: TabCompletionContext diff --git a/metaconfig-core/shared/src/main/scala/metaconfig/cli/HelpOptions.scala b/metaconfig-core/shared/src/main/scala/metaconfig/cli/HelpOptions.scala index efb92be5..80af8175 100644 --- a/metaconfig-core/shared/src/main/scala/metaconfig/cli/HelpOptions.scala +++ b/metaconfig-core/shared/src/main/scala/metaconfig/cli/HelpOptions.scala @@ -4,12 +4,6 @@ import metaconfig.generic.Field import metaconfig.generic.Surface import metaconfig.ConfEncoder import metaconfig.Conf -import org.typelevel.paiges.Doc -import scala.util.control.NonFatal -import metaconfig.Conf.Str -import java.io.PrintStream -import java.io.ByteArrayOutputStream -import java.nio.charset.StandardCharsets import metaconfig.annotation.ExtraName import metaconfig.ConfDecoder import metaconfig.Configured @@ -23,7 +17,7 @@ case class HelpOptions( // in the same project as where we define macros. The boilerplat is not nice at // all. object HelpOptions { - val default = HelpOptions() + val default: HelpOptions = HelpOptions() implicit val surface: Surface[HelpOptions] = new Surface( List( List( diff --git a/metaconfig-core/shared/src/main/scala/metaconfig/cli/Messages.scala b/metaconfig-core/shared/src/main/scala/metaconfig/cli/Messages.scala index 1dbb193e..bc829bb5 100644 --- a/metaconfig-core/shared/src/main/scala/metaconfig/cli/Messages.scala +++ b/metaconfig-core/shared/src/main/scala/metaconfig/cli/Messages.scala @@ -1,8 +1,5 @@ package metaconfig.cli -import java.io.ByteArrayOutputStream -import java.io.PrintStream -import java.nio.charset.StandardCharsets import metaconfig.annotation.Hidden import metaconfig.annotation.Inline import metaconfig.annotation.Section diff --git a/metaconfig-core/shared/src/main/scala/metaconfig/cli/TabCompleteCommand.scala b/metaconfig-core/shared/src/main/scala/metaconfig/cli/TabCompleteCommand.scala index 5e2a55bc..5e34a80f 100644 --- a/metaconfig-core/shared/src/main/scala/metaconfig/cli/TabCompleteCommand.scala +++ b/metaconfig-core/shared/src/main/scala/metaconfig/cli/TabCompleteCommand.scala @@ -1,18 +1,13 @@ package metaconfig.cli -import metaconfig.generic.Surface import scala.collection.immutable.Nil import metaconfig.generic.Settings import metaconfig.internal.CliParser import java.io.File import java.nio.file.Files import java.nio.file.Paths -import metaconfig.Conf -import metaconfig.generic import metaconfig.internal.Case import java.nio.file.Path -import scala.util.Try -import metaconfig.generic.Setting object TabCompleteCommand extends Command[TabCompleteOptions]("tab-complete") { diff --git a/metaconfig-core/shared/src/main/scala/metaconfig/cli/TabCompleteOptions.scala b/metaconfig-core/shared/src/main/scala/metaconfig/cli/TabCompleteOptions.scala index 3ce53707..328298b5 100644 --- a/metaconfig-core/shared/src/main/scala/metaconfig/cli/TabCompleteOptions.scala +++ b/metaconfig-core/shared/src/main/scala/metaconfig/cli/TabCompleteOptions.scala @@ -3,7 +3,6 @@ package metaconfig.cli import metaconfig._ import metaconfig.annotation._ import metaconfig.generic._ -import metaconfig.generic import metaconfig.internal.CliParser case class TabCompleteOptions( @@ -12,7 +11,7 @@ case class TabCompleteOptions( arguments: List[String] = Nil ) object TabCompleteOptions { - val default = TabCompleteOptions() + val default: TabCompleteOptions = TabCompleteOptions() implicit val surface: Surface[TabCompleteOptions] = new Surface( List( List( diff --git a/metaconfig-core/shared/src/main/scala/metaconfig/cli/VersionCommand.scala b/metaconfig-core/shared/src/main/scala/metaconfig/cli/VersionCommand.scala index d9bbfe8f..d2589a4b 100644 --- a/metaconfig-core/shared/src/main/scala/metaconfig/cli/VersionCommand.scala +++ b/metaconfig-core/shared/src/main/scala/metaconfig/cli/VersionCommand.scala @@ -1,8 +1,5 @@ package metaconfig.cli -import metaconfig.generic.Surface -import metaconfig.ConfEncoder -import metaconfig.Conf import org.typelevel.paiges.Doc object VersionCommand extends Command[Unit]("version") { diff --git a/metaconfig-core/shared/src/main/scala/metaconfig/internal/CliParser.scala b/metaconfig-core/shared/src/main/scala/metaconfig/internal/CliParser.scala index ac327185..8436650f 100644 --- a/metaconfig-core/shared/src/main/scala/metaconfig/internal/CliParser.scala +++ b/metaconfig-core/shared/src/main/scala/metaconfig/internal/CliParser.scala @@ -5,7 +5,6 @@ import metaconfig.generic.Setting import metaconfig.generic.Settings import metaconfig.Configured.ok import metaconfig.annotation.Inline -import metaconfig.Configured.Ok import metaconfig.Configured.NotOk class CliParser[T]( diff --git a/metaconfig-core/shared/src/main/scala/metaconfig/internal/Macros.scala b/metaconfig-core/shared/src/main/scala/metaconfig/internal/Macros.scala index 7ce14095..97d65c0e 100644 --- a/metaconfig-core/shared/src/main/scala/metaconfig/internal/Macros.scala +++ b/metaconfig-core/shared/src/main/scala/metaconfig/internal/Macros.scala @@ -1,7 +1,5 @@ package metaconfig.internal -import scala.language.experimental.macros - import scala.annotation.StaticAnnotation import scala.reflect.macros.blackbox import metaconfig._ diff --git a/metaconfig-json/src/main/scala/metaconfig/internal/JsonConfParser.scala b/metaconfig-json/src/main/scala/metaconfig/internal/JsonConfParser.scala index 29a1c4f3..414c72d3 100644 --- a/metaconfig-json/src/main/scala/metaconfig/internal/JsonConfParser.scala +++ b/metaconfig-json/src/main/scala/metaconfig/internal/JsonConfParser.scala @@ -11,7 +11,7 @@ final class JsonConfParser[J](input: Input) with CharBasedParser[J] { var line = 0 val chars = input.chars - val wrapped = CharBuffer.wrap(chars) + val wrapped: CharBuffer = CharBuffer.wrap(chars) override def die(i: Int, msg: String): Nothing = { val pos = Position.Range(input, i, i) diff --git a/metaconfig-sconfig/jvm/src/test/scala/metaconfig/sconfig/PatchProps.scala b/metaconfig-sconfig/jvm/src/test/scala/metaconfig/sconfig/PatchProps.scala deleted file mode 100644 index e9fbd697..00000000 --- a/metaconfig-sconfig/jvm/src/test/scala/metaconfig/sconfig/PatchProps.scala +++ /dev/null @@ -1,58 +0,0 @@ -package metaconfig.sconfig - -import metaconfig.Conf -import metaconfig.ConfOps -import metaconfig.ConfShow -import org.scalacheck.Prop.forAll -import org.scalacheck.Properties -import org.scalameta.logger -import scala.meta.testkit.DiffAssertions -import metaconfig.Generators.argConfShow - -object PatchProps { - // asserts that applying - def checkPatch(a: String, b: String): Boolean = { - val original = Conf.parseString(a).get - val revised = Conf.parseString(b).get - val patch = Conf.patch(original, revised) - val expected = Conf.applyPatch(original, revised) - val obtained = Conf.applyPatch(original, patch) - if (obtained != expected) { - logger.elem( - obtained, - expected, - patch.toString, - Conf.patch(obtained, expected) - ) - } - obtained == expected - } -} - -class PatchProps extends Properties("Patch") { - - property("roundtrip") = forAll { (a: ConfShow, b: ConfShow) => - PatchProps.checkPatch(a.str, b.str) - } - -} -class PatchPropsSuite extends munit.FunSuite { - def check(a: String, b: String): Unit = { - test(a) { - assert(PatchProps.checkPatch(clue(a), clue(b))) - } - } - - check( - """ - |ad.da = true - |cc.bd = "dd" - """.stripMargin, - """ - | - |ad.a.dc = false - |ad = "ad" - """.stripMargin - ) - -} diff --git a/metaconfig-sconfig/shared/src/main/scala/metaconfig/sconfig/package.scala b/metaconfig-sconfig/shared/src/main/scala/metaconfig/sconfig/package.scala index 103b538e..f74ae56a 100644 --- a/metaconfig-sconfig/shared/src/main/scala/metaconfig/sconfig/package.scala +++ b/metaconfig-sconfig/shared/src/main/scala/metaconfig/sconfig/package.scala @@ -1,12 +1,13 @@ package metaconfig package object sconfig { - implicit val sConfigMetaconfigParser = new MetaconfigParser { - override def fromInput(input: Input): Configured[Conf] = input match { - case Input.File(path, _) => - SConfig2Class.gimmeConfFromFile(path.toFile) - case els => - SConfig2Class.gimmeConfFromString(new String(els.chars)) + implicit val sConfigMetaconfigParser: MetaconfigParser = + new MetaconfigParser { + override def fromInput(input: Input): Configured[Conf] = input match { + case Input.File(path, _) => + SConfig2Class.gimmeConfFromFile(path.toFile) + case els => + SConfig2Class.gimmeConfFromString(new String(els.chars)) + } } - } } diff --git a/metaconfig-tests/src/main/graal/reflection.json b/metaconfig-tests/jvm/src/main/graal/reflection.json similarity index 100% rename from metaconfig-tests/src/main/graal/reflection.json rename to metaconfig-tests/jvm/src/main/graal/reflection.json diff --git a/metaconfig-tests/jvm/src/main/scala/metaconfig/cli/Markdownish.scala b/metaconfig-tests/jvm/src/main/scala/metaconfig/cli/Markdownish.scala new file mode 100644 index 00000000..010d6f95 --- /dev/null +++ b/metaconfig-tests/jvm/src/main/scala/metaconfig/cli/Markdownish.scala @@ -0,0 +1,28 @@ +package metaconfig.cli + +import metaconfig.generic +import metaconfig.annotation.Description +import metaconfig.ConfCodec +import metaconfig.generic.Surface + +case class Markdownish( + @Description( + """|The JVM classpath is a list of path ':' separated files. + |Example: + | + |``` + |a.jar:b.jar:c.jar + |``` + | + |The JVM classpath is a list of path ':' separated files. + |""".stripMargin + ) + classpath: List[String] = Nil +) +object Markdownish { + val default: Markdownish = Markdownish() + implicit val surface: Surface[Markdownish] = + generic.deriveSurface[Markdownish] + implicit val codec: ConfCodec[Markdownish] = + generic.deriveCodec[Markdownish](default) +} diff --git a/metaconfig-core/jvm/src/test/scala/metaconfig/cli/Options.scala b/metaconfig-tests/jvm/src/main/scala/metaconfig/cli/Options.scala similarity index 92% rename from metaconfig-core/jvm/src/test/scala/metaconfig/cli/Options.scala rename to metaconfig-tests/jvm/src/main/scala/metaconfig/cli/Options.scala index a6b814d5..0f693ebe 100644 --- a/metaconfig-core/jvm/src/test/scala/metaconfig/cli/Options.scala +++ b/metaconfig-tests/jvm/src/main/scala/metaconfig/cli/Options.scala @@ -3,8 +3,7 @@ package metaconfig.cli import java.nio.file.Paths import metaconfig.annotation._ import metaconfig._ -import metaconfig.generic.Settings -import java.io.File +import metaconfig.generic.Surface case class Options( @Description("The input directory to generate the fox site.") @@ -41,7 +40,7 @@ case class Options( hidden: Int = 87 ) object Options { - implicit val surface = generic.deriveSurface[Options] + implicit val surface: Surface[Options] = generic.deriveSurface[Options] implicit val codec: ConfCodec[Options] = generic.deriveCodec[Options](Options()) } diff --git a/metaconfig-tests/jvm/src/main/scala/metaconfig/cli/Site.scala b/metaconfig-tests/jvm/src/main/scala/metaconfig/cli/Site.scala new file mode 100644 index 00000000..097bf7d4 --- /dev/null +++ b/metaconfig-tests/jvm/src/main/scala/metaconfig/cli/Site.scala @@ -0,0 +1,13 @@ +package metaconfig.cli + +import metaconfig._ +import metaconfig.generic.Surface + +case class Site( + foo: String = "foo", + custom: Map[String, String] = Map.empty +) +object Site { + implicit val surface: Surface[Site] = generic.deriveSurface[Site] + implicit val codec: ConfCodec[Site] = generic.deriveCodec[Site](Site()) +} diff --git a/metaconfig-tests/src/main/scala/metaconfig/tests/ExampleMain.scala b/metaconfig-tests/jvm/src/main/scala/metaconfig/tests/ExampleMain.scala similarity index 84% rename from metaconfig-tests/src/main/scala/metaconfig/tests/ExampleMain.scala rename to metaconfig-tests/jvm/src/main/scala/metaconfig/tests/ExampleMain.scala index 44746119..db52231b 100644 --- a/metaconfig-tests/src/main/scala/metaconfig/tests/ExampleMain.scala +++ b/metaconfig-tests/jvm/src/main/scala/metaconfig/tests/ExampleMain.scala @@ -8,7 +8,8 @@ import metaconfig.cli.HelpCommand import metaconfig.cli.VersionCommand import metaconfig.cli.TabCompleteCommand import metaconfig.annotation.ExtraName -import metaconfig.annotation.TabCompleteAsPath +import metaconfig.ConfCodec +import metaconfig.generic.Surface case class ExampleOptions( path: Path = Paths.get(".").toAbsolutePath().normalize(), @@ -18,9 +19,9 @@ case class ExampleOptions( ) object ExampleOptions { - implicit val surface = + implicit val surface: Surface[ExampleOptions] = metaconfig.generic.deriveSurface[ExampleOptions] - implicit val codec = + implicit val codec: ConfCodec[ExampleOptions] = metaconfig.generic.deriveCodec[ExampleOptions](ExampleOptions()) } @@ -31,7 +32,7 @@ object ExampleCommand extends Command[ExampleOptions]("example") { } object ExampleMain { - val app = CliApp( + val app: CliApp = CliApp( version = "1.0", "hello", List( diff --git a/metaconfig-tests/jvm/src/test/scala/metaconfig/CodecRoundtripSuite.scala b/metaconfig-tests/jvm/src/test/scala/metaconfig/CodecRoundtripSuite.scala new file mode 100644 index 00000000..5b11c551 --- /dev/null +++ b/metaconfig-tests/jvm/src/test/scala/metaconfig/CodecRoundtripSuite.scala @@ -0,0 +1,26 @@ +package metaconfig + +import org.scalacheck.Prop.forAll +import org.scalacheck.ScalacheckShapeless._ + +class CodecRoundtripSuite extends munit.ScalaCheckSuite { + + def checkRoundtrip[T: ConfCodec](a: T): Boolean = { + val conf = ConfEncoder[T].write(a) + val b = ConfDecoder[T].read(conf).get + a == b + } + + property("roundtrip AllTheAnnotations") { + forAll { a: AllTheAnnotations => + checkRoundtrip(a) + } + } + + property("roundtrip Outer") { + forAll { a: Outer => + checkRoundtrip(a) + } + } + +} diff --git a/metaconfig-core/jvm/src/test/scala/metaconfig/HoconPrinterSuite.scala b/metaconfig-tests/jvm/src/test/scala/metaconfig/HoconPrinterSuite.scala similarity index 100% rename from metaconfig-core/jvm/src/test/scala/metaconfig/HoconPrinterSuite.scala rename to metaconfig-tests/jvm/src/test/scala/metaconfig/HoconPrinterSuite.scala diff --git a/metaconfig-tests/jvm/src/test/scala/metaconfig/Inner.scala b/metaconfig-tests/jvm/src/test/scala/metaconfig/Inner.scala new file mode 100644 index 00000000..bba83d9b --- /dev/null +++ b/metaconfig-tests/jvm/src/test/scala/metaconfig/Inner.scala @@ -0,0 +1,9 @@ +package metaconfig + +import metaconfig.generic.Surface + +case class Inner(a: String = "a", b: Boolean = true) +object Inner { + implicit val surface: Surface[Inner] = generic.deriveSurface[Inner] + implicit val codec: ConfCodec[Inner] = generic.deriveCodec(Inner()) +} diff --git a/metaconfig-json/src/test/scala/metaconfig/JsonSchemaSuite.scala b/metaconfig-tests/jvm/src/test/scala/metaconfig/JsonSchemaSuite.scala similarity index 85% rename from metaconfig-json/src/test/scala/metaconfig/JsonSchemaSuite.scala rename to metaconfig-tests/jvm/src/test/scala/metaconfig/JsonSchemaSuite.scala index c6a4b809..9fc9d701 100644 --- a/metaconfig-json/src/test/scala/metaconfig/JsonSchemaSuite.scala +++ b/metaconfig-tests/jvm/src/test/scala/metaconfig/JsonSchemaSuite.scala @@ -2,7 +2,7 @@ package metaconfig import metaconfig.annotation._ import metaconfig.generic.Settings -import scala.meta.testkit.DiffAssertions +import metaconfig.generic.Surface class JsonSchemaSuite extends munit.FunSuite { @@ -30,8 +30,8 @@ class JsonSchemaSuite extends munit.FunSuite { repeated: Seq[Int] ) object Simple { - implicit val encoder = generic.deriveEncoder[Simple] - implicit val surface = generic.deriveSurface[Simple] + implicit val encoder: ConfEncoder[Simple] = generic.deriveEncoder[Simple] + implicit val surface: Surface[Simple] = generic.deriveSurface[Simple] } check( @@ -70,8 +70,8 @@ class JsonSchemaSuite extends munit.FunSuite { value: String ) object B { - implicit val encoder = generic.deriveEncoder[B] - implicit val surface = generic.deriveSurface[B] + implicit val encoder: ConfEncoder[B] = generic.deriveEncoder[B] + implicit val surface: Surface[B] = generic.deriveSurface[B] } case class A( value: Int, @@ -79,8 +79,8 @@ class JsonSchemaSuite extends munit.FunSuite { b: B ) object A { - implicit val encoder = generic.deriveEncoder[A] - implicit val surface = generic.deriveSurface[A] + implicit val encoder: ConfEncoder[A] = generic.deriveEncoder[A] + implicit val surface: Surface[A] = generic.deriveSurface[A] } check( diff --git a/metaconfig-tests/jvm/src/test/scala/metaconfig/Outer.scala b/metaconfig-tests/jvm/src/test/scala/metaconfig/Outer.scala new file mode 100644 index 00000000..783c2326 --- /dev/null +++ b/metaconfig-tests/jvm/src/test/scala/metaconfig/Outer.scala @@ -0,0 +1,9 @@ +package metaconfig + +import metaconfig.generic.Surface + +case class Outer(inner: Inner = Inner(), c: Int = 0) +object Outer { + implicit val surface: Surface[Outer] = generic.deriveSurface + implicit val codec: ConfCodec[Outer] = generic.deriveCodec(Outer()) +} diff --git a/metaconfig-core/jvm/src/test/scala/metaconfig/PatchSuite.scala b/metaconfig-tests/jvm/src/test/scala/metaconfig/PatchSuite.scala similarity index 100% rename from metaconfig-core/jvm/src/test/scala/metaconfig/PatchSuite.scala rename to metaconfig-tests/jvm/src/test/scala/metaconfig/PatchSuite.scala diff --git a/metaconfig-core/jvm/src/test/scala/metaconfig/cli/BaseCliParserSuite.scala b/metaconfig-tests/jvm/src/test/scala/metaconfig/cli/BaseCliParserSuite.scala similarity index 91% rename from metaconfig-core/jvm/src/test/scala/metaconfig/cli/BaseCliParserSuite.scala rename to metaconfig-tests/jvm/src/test/scala/metaconfig/cli/BaseCliParserSuite.scala index 308804fe..2ed68ad1 100644 --- a/metaconfig-core/jvm/src/test/scala/metaconfig/cli/BaseCliParserSuite.scala +++ b/metaconfig-tests/jvm/src/test/scala/metaconfig/cli/BaseCliParserSuite.scala @@ -1,13 +1,10 @@ package metaconfig.cli -import java.nio.file.Paths -import metaconfig.annotation._ import metaconfig._ import metaconfig.generic.Settings -import java.io.File class BaseCliParserSuite extends munit.FunSuite { - val settings = Settings[Options] + val settings: Settings[Options] = Settings[Options] def toString(options: Options): String = { settings.settings .zip(options.productIterator.toList) diff --git a/metaconfig-core/jvm/src/test/scala/metaconfig/cli/CaseSuite.scala b/metaconfig-tests/jvm/src/test/scala/metaconfig/cli/CaseSuite.scala similarity index 100% rename from metaconfig-core/jvm/src/test/scala/metaconfig/cli/CaseSuite.scala rename to metaconfig-tests/jvm/src/test/scala/metaconfig/cli/CaseSuite.scala diff --git a/metaconfig-core/jvm/src/test/scala/metaconfig/cli/CliParserSuite.scala b/metaconfig-tests/jvm/src/test/scala/metaconfig/cli/CliParserSuite.scala similarity index 97% rename from metaconfig-core/jvm/src/test/scala/metaconfig/cli/CliParserSuite.scala rename to metaconfig-tests/jvm/src/test/scala/metaconfig/cli/CliParserSuite.scala index 48fb4390..5aeeddfb 100644 --- a/metaconfig-core/jvm/src/test/scala/metaconfig/cli/CliParserSuite.scala +++ b/metaconfig-tests/jvm/src/test/scala/metaconfig/cli/CliParserSuite.scala @@ -1,10 +1,6 @@ package metaconfig.cli -import java.nio.file.Paths -import metaconfig.annotation._ import metaconfig._ -import metaconfig.generic.Settings -import java.io.File class CliParserSuite extends BaseCliParserSuite { diff --git a/metaconfig-core/jvm/src/test/scala/metaconfig/cli/CliSuite.scala b/metaconfig-tests/jvm/src/test/scala/metaconfig/cli/CliSuite.scala similarity index 71% rename from metaconfig-core/jvm/src/test/scala/metaconfig/cli/CliSuite.scala rename to metaconfig-tests/jvm/src/test/scala/metaconfig/cli/CliSuite.scala index e3712275..226d7d26 100644 --- a/metaconfig-core/jvm/src/test/scala/metaconfig/cli/CliSuite.scala +++ b/metaconfig-tests/jvm/src/test/scala/metaconfig/cli/CliSuite.scala @@ -1,34 +1,6 @@ package metaconfig.cli -import metaconfig.generic -import metaconfig.generic.Settings -import metaconfig.Conf import org.typelevel.paiges.Doc -import metaconfig.annotation.Description -import metaconfig.ConfCodec -import metaconfig.generic.Surface - -case class Markdownish( - @Description( - """|The JVM classpath is a list of path ':' separated files. - |Example: - | - |``` - |a.jar:b.jar:c.jar - |``` - | - |The JVM classpath is a list of path ':' separated files. - |""".stripMargin - ) - classpath: List[String] = Nil -) -object Markdownish { - val default = Markdownish() - implicit val surface: Surface[Markdownish] = - generic.deriveSurface[Markdownish] - implicit val codec: ConfCodec[Markdownish] = - generic.deriveCodec[Markdownish](default) -} class CliSuite extends munit.FunSuite { def checkOptions[T]( diff --git a/metaconfig-core/jvm/src/test/scala/metaconfig/cli/SubcommandSuite.scala b/metaconfig-tests/jvm/src/test/scala/metaconfig/cli/SubcommandSuite.scala similarity index 89% rename from metaconfig-core/jvm/src/test/scala/metaconfig/cli/SubcommandSuite.scala rename to metaconfig-tests/jvm/src/test/scala/metaconfig/cli/SubcommandSuite.scala index 0ebb4da8..12fab986 100644 --- a/metaconfig-core/jvm/src/test/scala/metaconfig/cli/SubcommandSuite.scala +++ b/metaconfig-tests/jvm/src/test/scala/metaconfig/cli/SubcommandSuite.scala @@ -9,6 +9,8 @@ import metaconfig.annotation.Section import metaconfig.annotation.Description import metaconfig.annotation.Inline import metaconfig.annotation.Hidden +import metaconfig.ConfCodec +import metaconfig.generic.Surface class SubcommandSuite extends FunSuite { case class CommonOptions( @@ -24,17 +26,20 @@ class SubcommandSuite extends FunSuite { invisible: Int = 41, @Inline() common: CommonOptions = CommonOptions() ) - implicit val commonSurface = metaconfig.generic.deriveSurface[CommonOptions] - implicit val commonCodec = + implicit val commonSurface: Surface[CommonOptions] = + metaconfig.generic.deriveSurface[CommonOptions] + implicit val commonCodec: ConfCodec[CommonOptions] = metaconfig.generic.deriveCodec[CommonOptions](CommonOptions()) - implicit val surface = metaconfig.generic.deriveSurface[TestOptions] - implicit val codec = + implicit val surface: Surface[TestOptions] = + metaconfig.generic.deriveSurface[TestOptions] + implicit val codec: ConfCodec[TestOptions] = metaconfig.generic.deriveCodec[TestOptions](TestOptions()) object TestCommand extends Command[TestOptions]("test") { override def description: Doc = Doc.paragraph("Run tests") override def options: Doc = Messages.options(TestOptions()) - override def usage = Doc.text("app test [OPTIONS] [project ...]") - override def examples = Doc.text("app test --max-count=100 project-name") + override def usage: Doc = Doc.text("app test [OPTIONS] [project ...]") + override def examples: Doc = + Doc.text("app test --max-count=100 project-name") def run(value: Value, app: CliApp): Int = { app.out.println("verbose: " + value.verbose) app.out.println("max-count: " + value.maxCount) @@ -42,7 +47,7 @@ class SubcommandSuite extends FunSuite { 0 } } - def checkError(args: List[String], expected: String) = + def checkError(args: List[String], expected: String): Unit = check(args, expected, expectedExit = 1) def check( args: List[String], diff --git a/metaconfig-core/jvm/src/test/scala/metaconfig/cli/TabCompletionSuite.scala b/metaconfig-tests/jvm/src/test/scala/metaconfig/cli/TabCompletionSuite.scala similarity index 97% rename from metaconfig-core/jvm/src/test/scala/metaconfig/cli/TabCompletionSuite.scala rename to metaconfig-tests/jvm/src/test/scala/metaconfig/cli/TabCompletionSuite.scala index 47a07fd7..ebadfd16 100644 --- a/metaconfig-core/jvm/src/test/scala/metaconfig/cli/TabCompletionSuite.scala +++ b/metaconfig-tests/jvm/src/test/scala/metaconfig/cli/TabCompletionSuite.scala @@ -25,7 +25,8 @@ class TabCompletionSuite extends FunSuite { hidden: Int = 87 ) object TabOptions { - implicit val surface = generic.deriveSurface[TabOptions] + implicit val surface: generic.Surface[TabOptions] = + generic.deriveSurface[TabOptions] implicit val codec: ConfCodec[TabOptions] = generic.deriveCodec[TabOptions](TabOptions()) } diff --git a/metaconfig-json/src/test/scala/metaconfig/internal/JsonConfErrorSuite.scala b/metaconfig-tests/jvm/src/test/scala/metaconfig/internal/JsonConfErrorSuite.scala similarity index 100% rename from metaconfig-json/src/test/scala/metaconfig/internal/JsonConfErrorSuite.scala rename to metaconfig-tests/jvm/src/test/scala/metaconfig/internal/JsonConfErrorSuite.scala diff --git a/metaconfig-json/src/test/scala/metaconfig/internal/JsonConfParserSuite.scala b/metaconfig-tests/jvm/src/test/scala/metaconfig/internal/JsonConfParserSuite.scala similarity index 100% rename from metaconfig-json/src/test/scala/metaconfig/internal/JsonConfParserSuite.scala rename to metaconfig-tests/jvm/src/test/scala/metaconfig/internal/JsonConfParserSuite.scala diff --git a/metaconfig-sconfig/jvm/src/test/scala/metaconfig/sconfig/HoconPrinterProps.scala b/metaconfig-tests/jvm/src/test/scala/metaconfig/sconfig/HoconPrinterRoundtripSuite.scala similarity index 51% rename from metaconfig-sconfig/jvm/src/test/scala/metaconfig/sconfig/HoconPrinterProps.scala rename to metaconfig-tests/jvm/src/test/scala/metaconfig/sconfig/HoconPrinterRoundtripSuite.scala index 06a7a06a..ed8ba728 100644 --- a/metaconfig-sconfig/jvm/src/test/scala/metaconfig/sconfig/HoconPrinterProps.scala +++ b/metaconfig-tests/jvm/src/test/scala/metaconfig/sconfig/HoconPrinterRoundtripSuite.scala @@ -1,41 +1,22 @@ package metaconfig.sconfig import metaconfig.Conf -import metaconfig.ConfOps import metaconfig.ConfShow -import org.scalacheck.Properties -import org.scalameta.logger -import scala.meta.testkit.DiffAssertions import metaconfig.Generators.argConfShow import org.scalacheck.Prop.forAll -object HoconPrinterProps { - def checkRoundtrip(conf: String): Boolean = { +class HoconPrinterRoundtripSuite extends munit.ScalaCheckSuite { + def assertRoundtrip(conf: String): Unit = { val a = Conf.parseString(conf).get val hocon = Conf.printHocon(a) val b = Conf.parseString(hocon).get val isEqual = a == b - if (!isEqual) { - pprint.log(a) - pprint.log(b) - logger.elem(conf, hocon, Conf.patch(a, b)) - } - a == b - } - -} - -class HoconPrinterProps extends Properties("HoconPrinter") { - property("roundtrip") = forAll { conf: ConfShow => - HoconPrinterProps.checkRoundtrip(conf.str) + assertEquals(a, b) } -} - -class HoconPrinterRoundtripSuite extends munit.FunSuite { def ignore(conf: String): Unit = super.test(conf.ignore) {} def checkRoundtrip(conf: String): Unit = test(conf.take(100)) { - assert(HoconPrinterProps.checkRoundtrip(conf)) + assertRoundtrip(clue(conf)) } ignore( @@ -52,4 +33,10 @@ class HoconPrinterRoundtripSuite extends munit.FunSuite { |aa.aa = "cb" """.stripMargin ) + + property("roundtrip") { + forAll { conf: ConfShow => + assertRoundtrip(conf.str) + } + } } diff --git a/metaconfig-sconfig/jvm/src/test/scala/metaconfig/sconfig/SConfig2ClassTest.scala b/metaconfig-tests/jvm/src/test/scala/metaconfig/sconfig/SConfig2ClassSuite.scala similarity index 95% rename from metaconfig-sconfig/jvm/src/test/scala/metaconfig/sconfig/SConfig2ClassTest.scala rename to metaconfig-tests/jvm/src/test/scala/metaconfig/sconfig/SConfig2ClassSuite.scala index e59e7049..bbb81bb7 100644 --- a/metaconfig-sconfig/jvm/src/test/scala/metaconfig/sconfig/SConfig2ClassTest.scala +++ b/metaconfig-tests/jvm/src/test/scala/metaconfig/sconfig/SConfig2ClassSuite.scala @@ -5,7 +5,7 @@ import java.nio.file.Files import java.nio.file.Paths import metaconfig.Conf -class SConfig2ClassTest extends munit.FunSuite { +class SConfig2ClassSuite extends munit.FunSuite { test("basic") { val file = File.createTempFile("prefix", ".conf") Files.write( diff --git a/metaconfig-tests/jvm/src/test/scala/metaconfig/sconfig/SconfigPropertySuite.scala b/metaconfig-tests/jvm/src/test/scala/metaconfig/sconfig/SconfigPropertySuite.scala new file mode 100644 index 00000000..575b1a5b --- /dev/null +++ b/metaconfig-tests/jvm/src/test/scala/metaconfig/sconfig/SconfigPropertySuite.scala @@ -0,0 +1,41 @@ +package metaconfig.sconfig + +import metaconfig.Conf +import metaconfig.ConfShow +import org.scalacheck.Prop.forAll +import metaconfig.Generators.argConfShow + +class SconfigPropertySuite extends munit.ScalaCheckSuite { + def assertRoundtrip(a: String, b: String): Unit = { + val original = Conf.parseString(a).get + val revised = Conf.parseString(b).get + val patch = Conf.patch(original, revised) + val expected = Conf.applyPatch(original, revised) + val obtained = Conf.applyPatch(original, patch) + assertEquals(obtained, expected) + } + + def checkRoundtrip(a: String, b: String): Unit = { + test(a) { + assertRoundtrip(a, b) + } + } + + checkRoundtrip( + """ + |ad.da = true + |cc.bd = "dd" + """.stripMargin, + """ + | + |ad.a.dc = false + |ad = "ad" + """.stripMargin + ) + + property("roundtrip") { + forAll { (a: ConfShow, b: ConfShow) => + assertRoundtrip(a.str, b.str) + } + } +} diff --git a/metaconfig-typesafe-config/src/test/scala/metaconfig/typesafeconfig/HoconPrinterProps.scala b/metaconfig-tests/jvm/src/test/scala/metaconfig/typesafeconfig/HoconPrinterRoundtripSuite.scala similarity index 51% rename from metaconfig-typesafe-config/src/test/scala/metaconfig/typesafeconfig/HoconPrinterProps.scala rename to metaconfig-tests/jvm/src/test/scala/metaconfig/typesafeconfig/HoconPrinterRoundtripSuite.scala index fe0d29cc..45d20b18 100644 --- a/metaconfig-typesafe-config/src/test/scala/metaconfig/typesafeconfig/HoconPrinterProps.scala +++ b/metaconfig-tests/jvm/src/test/scala/metaconfig/typesafeconfig/HoconPrinterRoundtripSuite.scala @@ -1,43 +1,30 @@ package metaconfig.typesafeconfig import metaconfig.Conf -import metaconfig.ConfOps import metaconfig.ConfShow -import org.scalacheck.Properties -import org.scalameta.logger -import scala.meta.testkit.DiffAssertions import metaconfig.Generators.argConfShow import org.scalacheck.Prop.forAll -object HoconPrinterProps { - def checkRoundtrip(conf: String): Boolean = { +class HoconPrinterRoundtripSuite extends munit.ScalaCheckSuite { + def assertRoundtrip(conf: String): Unit = { val a = Conf.parseString(conf).get val hocon = Conf.printHocon(a) val b = Conf.parseString(hocon).get val isEqual = a == b - if (!isEqual) { - pprint.log(a) - pprint.log(b) - logger.elem(conf, hocon, Conf.patch(a, b)) - } - a == b - } - -} - -class HoconPrinterProps extends Properties("HoconPrinter") { - property("roundtrip") = forAll { conf: ConfShow => - HoconPrinterProps.checkRoundtrip(conf.str) + assertEquals(a, b) } -} - -class HoconPrinterRoundtripSuite extends munit.FunSuite { def ignore(conf: String): Unit = super.test(conf.ignore) {} + def checkRoundtrip(conf: String): Unit = test(conf.take(100)) { - assert(HoconPrinterProps.checkRoundtrip(conf)) + assertRoundtrip(conf) } + property("roundtrip") { + forAll { conf: ConfShow => + assertRoundtrip(conf.str) + } + } ignore( """ |a.a = "d" diff --git a/metaconfig-typesafe-config/src/test/scala/metaconfig/typesafeconfig/TypesafeConfig2ClassTest.scala b/metaconfig-tests/jvm/src/test/scala/metaconfig/typesafeconfig/TypesafeConfig2ClassSuite.scala similarity index 95% rename from metaconfig-typesafe-config/src/test/scala/metaconfig/typesafeconfig/TypesafeConfig2ClassTest.scala rename to metaconfig-tests/jvm/src/test/scala/metaconfig/typesafeconfig/TypesafeConfig2ClassSuite.scala index b1cb2ac1..fac36cf2 100644 --- a/metaconfig-typesafe-config/src/test/scala/metaconfig/typesafeconfig/TypesafeConfig2ClassTest.scala +++ b/metaconfig-tests/jvm/src/test/scala/metaconfig/typesafeconfig/TypesafeConfig2ClassSuite.scala @@ -5,7 +5,7 @@ import java.nio.file.Files import java.nio.file.Paths import metaconfig.Conf -class TypesafeConfig2ClassTest extends munit.FunSuite { +class TypesafeConfig2ClassSuite extends munit.FunSuite { test("basic") { val file = File.createTempFile("prefix", ".conf") Files.write( diff --git a/metaconfig-tests/jvm/src/test/scala/metaconfig/typesafeconfig/TypesafeConfigPropertySuite.scala b/metaconfig-tests/jvm/src/test/scala/metaconfig/typesafeconfig/TypesafeConfigPropertySuite.scala new file mode 100644 index 00000000..6b673e21 --- /dev/null +++ b/metaconfig-tests/jvm/src/test/scala/metaconfig/typesafeconfig/TypesafeConfigPropertySuite.scala @@ -0,0 +1,42 @@ +package metaconfig.typesafeconfig + +import metaconfig.Conf +import metaconfig.ConfShow +import org.scalacheck.Prop.forAll +import metaconfig.Generators.argConfShow + +class TypesafeConfigPropertySuite extends munit.ScalaCheckSuite { + def check(a: String, b: String): Unit = { + test(a) { + assertRoundtrip(a, b) + } + } + + def assertRoundtrip(a: String, b: String): Unit = { + val original = Conf.parseString(a).get + val revised = Conf.parseString(b).get + val patch = Conf.patch(original, revised) + val expected = Conf.applyPatch(original, revised) + val obtained = Conf.applyPatch(original, patch) + assertEquals(obtained, expected) + } + + property("roundtrip") { + forAll { (a: ConfShow, b: ConfShow) => + assertRoundtrip(a.str, b.str) + } + } + + check( + """ + |ad.da = true + |cc.bd = "dd" + """.stripMargin, + """ + | + |ad.a.dc = false + |ad = "ad" + """.stripMargin + ) + +} diff --git a/metaconfig-core/shared/src/test/scala/metaconfig/AllTheAnnotations.scala b/metaconfig-tests/shared/src/main/scala/metaconfig/AllTheAnnotations.scala similarity index 69% rename from metaconfig-core/shared/src/test/scala/metaconfig/AllTheAnnotations.scala rename to metaconfig-tests/shared/src/main/scala/metaconfig/AllTheAnnotations.scala index 8081fbc9..4da48f2b 100644 --- a/metaconfig-core/shared/src/test/scala/metaconfig/AllTheAnnotations.scala +++ b/metaconfig-tests/shared/src/main/scala/metaconfig/AllTheAnnotations.scala @@ -36,14 +36,17 @@ object AllTheAnnotations { case class OneParam(param: Int = 82) object OneParam { implicit val surface: Surface[OneParam] = generic.deriveSurface[OneParam] - implicit val codec = generic.deriveCodec[OneParam](OneParam()) + implicit val codec: ConfCodec[OneParam] = + generic.deriveCodec[OneParam](OneParam()) } case class HasOption(b: Option[Int] = None) object HasOption { - implicit val surface = generic.deriveSurface[HasOption] - implicit val decoder = generic.deriveDecoder[HasOption](HasOption()) - implicit val encoder = generic.deriveEncoder[HasOption] + implicit val surface: Surface[HasOption] = generic.deriveSurface[HasOption] + implicit val decoder: ConfDecoder[HasOption] = + generic.deriveDecoder[HasOption](HasOption()) + implicit val encoder: ConfEncoder[HasOption] = + generic.deriveEncoder[HasOption] } case class Curry(a: Int)(b: String) @@ -65,19 +68,22 @@ case class IsIterable( b: Iterable[String] = Iterable.empty ) object IsIterable { - implicit val surface = generic.deriveSurface[IsIterable] - implicit val decoder = generic.deriveDecoder[IsIterable](IsIterable()) - implicit val encoder = generic.deriveEncoder[IsIterable] + implicit val surface: Surface[IsIterable] = generic.deriveSurface[IsIterable] + implicit val decoder: ConfDecoder[IsIterable] = + generic.deriveDecoder[IsIterable](IsIterable()) + implicit val encoder: ConfEncoder[IsIterable] = + generic.deriveEncoder[IsIterable] } case class Nested2(c: String = "nested2", b: OneParam = OneParam()) object Nested2 { - implicit val surface = generic.deriveSurface[Nested2] - implicit val codec = generic.deriveCodec[Nested2](Nested2()) + implicit val surface: Surface[Nested2] = generic.deriveSurface[Nested2] + implicit val codec: ConfCodec[Nested2] = + generic.deriveCodec[Nested2](Nested2()) } case class Nested(a: Int = 31, b: OneParam = OneParam(), c: Nested2 = Nested2()) object Nested { - implicit val surface = generic.deriveSurface[Nested] - implicit val codec = generic.deriveCodec[Nested](Nested()) + implicit val surface: Surface[Nested] = generic.deriveSurface[Nested] + implicit val codec: ConfCodec[Nested] = generic.deriveCodec[Nested](Nested()) } diff --git a/metaconfig-core/shared/src/test/scala/metaconfig/Generators.scala b/metaconfig-tests/shared/src/main/scala/metaconfig/Generators.scala similarity index 88% rename from metaconfig-core/shared/src/test/scala/metaconfig/Generators.scala rename to metaconfig-tests/shared/src/main/scala/metaconfig/Generators.scala index 90623b34..62563f59 100644 --- a/metaconfig-core/shared/src/test/scala/metaconfig/Generators.scala +++ b/metaconfig-tests/shared/src/main/scala/metaconfig/Generators.scala @@ -4,11 +4,11 @@ import org.scalacheck._ object Generators { import Conf._ - val genIdent = for { + val genIdent: Gen[String] = for { len <- Gen.choose(1, 2) chars <- Gen.listOfN(len, Gen.oneOf('a' to 'd')) } yield chars.mkString - val genKey = for { + val genKey: Gen[String] = for { depth <- Gen.choose(1, 3) idents <- Gen.listOfN(depth, genIdent) } yield idents.mkString(".") @@ -28,5 +28,5 @@ object Generators { } case class ConfShow(str: String) { - def input = Input.String(str) + def input: Input.String = Input.String(str) } diff --git a/metaconfig-core/shared/src/test/scala/metaconfig/ConfDynamicTest.scala b/metaconfig-tests/shared/src/test/scala/metaconfig/ConfDynamicSuite.scala similarity index 87% rename from metaconfig-core/shared/src/test/scala/metaconfig/ConfDynamicTest.scala rename to metaconfig-tests/shared/src/test/scala/metaconfig/ConfDynamicSuite.scala index de33ce11..d03bea79 100644 --- a/metaconfig-core/shared/src/test/scala/metaconfig/ConfDynamicTest.scala +++ b/metaconfig-tests/shared/src/test/scala/metaconfig/ConfDynamicSuite.scala @@ -1,8 +1,8 @@ package metaconfig -class ConfDynamicTest extends munit.FunSuite { +class ConfDynamicSuite extends munit.FunSuite { - val conf = Conf.Obj( + val conf: Conf.Obj = Conf.Obj( "x" -> Conf.Obj("c" -> Conf.Obj("d" -> Conf.Num(2))), "banana" -> Conf.Num(2), "kass" -> Conf.Str("boo") diff --git a/metaconfig-core/shared/src/test/scala/metaconfig/ConfErrorSuite.scala b/metaconfig-tests/shared/src/test/scala/metaconfig/ConfErrorSuite.scala similarity index 100% rename from metaconfig-core/shared/src/test/scala/metaconfig/ConfErrorSuite.scala rename to metaconfig-tests/shared/src/test/scala/metaconfig/ConfErrorSuite.scala diff --git a/metaconfig-core/shared/src/test/scala/metaconfig/ConfOptionTest.scala b/metaconfig-tests/shared/src/test/scala/metaconfig/ConfOptionSuite.scala similarity index 92% rename from metaconfig-core/shared/src/test/scala/metaconfig/ConfOptionTest.scala rename to metaconfig-tests/shared/src/test/scala/metaconfig/ConfOptionSuite.scala index da46367a..d2559547 100644 --- a/metaconfig-core/shared/src/test/scala/metaconfig/ConfOptionTest.scala +++ b/metaconfig-tests/shared/src/test/scala/metaconfig/ConfOptionSuite.scala @@ -9,7 +9,7 @@ object Foo { } } -class ConfOptionTest extends munit.FunSuite { +class ConfOptionSuite extends munit.FunSuite { import Conf._ test("simple") { diff --git a/metaconfig-core/shared/src/test/scala/metaconfig/DeriveConfCodecSuite.scala b/metaconfig-tests/shared/src/test/scala/metaconfig/DeriveConfCodecSuite.scala similarity index 100% rename from metaconfig-core/shared/src/test/scala/metaconfig/DeriveConfCodecSuite.scala rename to metaconfig-tests/shared/src/test/scala/metaconfig/DeriveConfCodecSuite.scala diff --git a/metaconfig-core/shared/src/test/scala/metaconfig/DeriveConfDecoderSuite.scala b/metaconfig-tests/shared/src/test/scala/metaconfig/DeriveConfDecoderSuite.scala similarity index 96% rename from metaconfig-core/shared/src/test/scala/metaconfig/DeriveConfDecoderSuite.scala rename to metaconfig-tests/shared/src/test/scala/metaconfig/DeriveConfDecoderSuite.scala index 00afceb4..0fb80c64 100644 --- a/metaconfig-core/shared/src/test/scala/metaconfig/DeriveConfDecoderSuite.scala +++ b/metaconfig-tests/shared/src/test/scala/metaconfig/DeriveConfDecoderSuite.scala @@ -1,9 +1,6 @@ package metaconfig import metaconfig.Conf._ -import metaconfig.annotation._ -import metaconfig.generic.Settings -import metaconfig.generic.Surface class DeriveConfDecoderSuite extends munit.FunSuite { diff --git a/metaconfig-core/shared/src/test/scala/metaconfig/DeriveConfEncoderSuite.scala b/metaconfig-tests/shared/src/test/scala/metaconfig/DeriveConfEncoderSuite.scala similarity index 100% rename from metaconfig-core/shared/src/test/scala/metaconfig/DeriveConfEncoderSuite.scala rename to metaconfig-tests/shared/src/test/scala/metaconfig/DeriveConfEncoderSuite.scala diff --git a/metaconfig-core/shared/src/test/scala/metaconfig/DeriveSurfaceSuite.scala b/metaconfig-tests/shared/src/test/scala/metaconfig/DeriveSurfaceSuite.scala similarity index 92% rename from metaconfig-core/shared/src/test/scala/metaconfig/DeriveSurfaceSuite.scala rename to metaconfig-tests/shared/src/test/scala/metaconfig/DeriveSurfaceSuite.scala index 09fd9131..2a7da6ea 100644 --- a/metaconfig-core/shared/src/test/scala/metaconfig/DeriveSurfaceSuite.scala +++ b/metaconfig-tests/shared/src/test/scala/metaconfig/DeriveSurfaceSuite.scala @@ -25,9 +25,14 @@ class DeriveSurfaceSuite extends munit.FunSuite { } case class Underlying(number: Int) - object Underlying { implicit val surface = generic.deriveSurface[Underlying] } + object Underlying { + implicit val surface: Surface[Underlying] = + generic.deriveSurface[Underlying] + } case class Enclosing(underlying: Underlying) - object Enclosing { implicit val surface = generic.deriveSurface[Enclosing] } + object Enclosing { + implicit val surface: Surface[Enclosing] = generic.deriveSurface[Enclosing] + } test("underlying") { val surface = generic.deriveSurface[Enclosing] val List(underlying :: Nil) = surface.fields diff --git a/metaconfig-core/shared/src/test/scala/metaconfig/EqualitySuite.scala b/metaconfig-tests/shared/src/test/scala/metaconfig/EqualitySuite.scala similarity index 100% rename from metaconfig-core/shared/src/test/scala/metaconfig/EqualitySuite.scala rename to metaconfig-tests/shared/src/test/scala/metaconfig/EqualitySuite.scala diff --git a/metaconfig-core/shared/src/test/scala/metaconfig/SettingsSuite.scala b/metaconfig-tests/shared/src/test/scala/metaconfig/SettingsSuite.scala similarity index 100% rename from metaconfig-core/shared/src/test/scala/metaconfig/SettingsSuite.scala rename to metaconfig-tests/shared/src/test/scala/metaconfig/SettingsSuite.scala diff --git a/metaconfig-typesafe-config/src/main/scala/metaconfig/typesafeconfig/package.scala b/metaconfig-typesafe-config/src/main/scala/metaconfig/typesafeconfig/package.scala index 62adb056..5b8c06a3 100644 --- a/metaconfig-typesafe-config/src/main/scala/metaconfig/typesafeconfig/package.scala +++ b/metaconfig-typesafe-config/src/main/scala/metaconfig/typesafeconfig/package.scala @@ -1,12 +1,13 @@ package metaconfig package object typesafeconfig { - implicit val typesafeConfigMetaconfigParser = new MetaconfigParser { - override def fromInput(input: Input): Configured[Conf] = input match { - case Input.File(path, _) => - TypesafeConfig2Class.gimmeConfFromFile(path.toFile) - case els => - TypesafeConfig2Class.gimmeConfFromString(new String(els.chars)) + implicit val typesafeConfigMetaconfigParser: MetaconfigParser = + new MetaconfigParser { + override def fromInput(input: Input): Configured[Conf] = input match { + case Input.File(path, _) => + TypesafeConfig2Class.gimmeConfFromFile(path.toFile) + case els => + TypesafeConfig2Class.gimmeConfFromString(new String(els.chars)) + } } - } } diff --git a/metaconfig-typesafe-config/src/test/scala/metaconfig/typesafeconfig/PatchProps.scala b/metaconfig-typesafe-config/src/test/scala/metaconfig/typesafeconfig/PatchProps.scala deleted file mode 100644 index e33413c9..00000000 --- a/metaconfig-typesafe-config/src/test/scala/metaconfig/typesafeconfig/PatchProps.scala +++ /dev/null @@ -1,56 +0,0 @@ -package metaconfig.typesafeconfig - -import metaconfig.Conf -import metaconfig.ConfOps -import metaconfig.ConfShow -import org.scalacheck.Prop.forAll -import org.scalacheck.Properties -import org.scalameta.logger -import scala.meta.testkit.DiffAssertions -import metaconfig.Generators.argConfShow - -object PatchProps { - // asserts that applying - def checkPatch(a: String, b: String): Boolean = { - val original = Conf.parseString(a).get - val revised = Conf.parseString(b).get - val patch = Conf.patch(original, revised) - val expected = Conf.applyPatch(original, revised) - val obtained = Conf.applyPatch(original, patch) - if (obtained != expected) { - logger.elem( - obtained, - expected, - patch.toString, - Conf.patch(obtained, expected) - ) - } - obtained == expected - } -} - -class PatchProps extends Properties("Patch") { - - property("roundtrip") = forAll { (a: ConfShow, b: ConfShow) => - PatchProps.checkPatch(a.str, b.str) - } - -} -class PatchPropsSuite extends munit.FunSuite { - def check(a: String, b: String): Unit = { - test(a) { assert(PatchProps.checkPatch(clue(a), clue(b))) } - } - - check( - """ - |ad.da = true - |cc.bd = "dd" - """.stripMargin, - """ - | - |ad.a.dc = false - |ad = "ad" - """.stripMargin - ) - -} diff --git a/project/plugins.sbt b/project/plugins.sbt index 0a3d1aaf..346a0c5f 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -1,6 +1,7 @@ addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % "1.6.1") addSbtPlugin("com.geirsson" % "sbt-ci-release" % "1.4.31") -addSbtPlugin("org.scala-js" % "sbt-scalajs" % "0.6.31") +addSbtPlugin("ch.epfl.scala" % "sbt-scalafix" % "0.9.14") +addSbtPlugin("org.scala-js" % "sbt-scalajs" % "0.6.32") addSbtPlugin("org.portable-scala" % "sbt-scalajs-crossproject" % "0.6.1") addSbtPlugin("org.portable-scala" % "sbt-scala-native-crossproject" % "0.6.0") addSbtPlugin("org.scala-native" % "sbt-scala-native" % "0.3.9") From 4711f711f32713a7f1d7c0438b0305e7fcf76198 Mon Sep 17 00:00:00 2001 From: Olafur Pall Geirsson Date: Sat, 18 Apr 2020 13:26:10 +0000 Subject: [PATCH 2/2] Upgrade Scalafmt --- .scalafmt.conf | 2 +- bin/scalafmt | Bin 28429 -> 25051 bytes build.sbt | 4 +--- .../src/main/scala/metaconfig/Conf.scala | 4 +--- .../src/main/scala/metaconfig/Input.scala | 3 ++- .../main/scala/metaconfig/cli/CliApp.scala | 4 +--- .../metaconfig/cli/TabCompleteCommand.scala | 8 +++----- .../scala/metaconfig/internal/ConfGet.scala | 3 ++- .../scala/metaconfig/internal/Macros.scala | 3 ++- .../metaconfig/CodecRoundtripSuite.scala | 8 ++------ .../sconfig/HoconPrinterRoundtripSuite.scala | 4 +--- .../sconfig/SconfigPropertySuite.scala | 4 +--- .../HoconPrinterRoundtripSuite.scala | 4 +--- .../TypesafeConfigPropertySuite.scala | 4 +--- .../scala/metaconfig/DeriveSurfaceSuite.scala | 12 +++--------- 15 files changed, 22 insertions(+), 45 deletions(-) diff --git a/.scalafmt.conf b/.scalafmt.conf index 74e5bbc2..316d3828 100644 --- a/.scalafmt.conf +++ b/.scalafmt.conf @@ -1,4 +1,4 @@ -version = "2.0.0" +version = "2.4.2" assumeStandardLibraryStripMargin = true align = none project.git = true diff --git a/bin/scalafmt b/bin/scalafmt index 82ad61094198beabb7dcdf6c52a8062dc2b1c63a..84ecc00deb45c51c565c10ea84aa4ba8e63d5c63 100755 GIT binary patch literal 25051 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 - old.replace('+', '-') - }, + version ~= { old => old.replace('+', '-') }, licenses := Seq( "Apache-2.0" -> url("http://www.apache.org/licenses/LICENSE-2.0") ), diff --git a/metaconfig-core/shared/src/main/scala/metaconfig/Conf.scala b/metaconfig-core/shared/src/main/scala/metaconfig/Conf.scala index c529d432..984fdd4f 100644 --- a/metaconfig-core/shared/src/main/scala/metaconfig/Conf.scala +++ b/metaconfig-core/shared/src/main/scala/metaconfig/Conf.scala @@ -107,9 +107,7 @@ object Conf { ): Configured[Option[T]] = ConfGet .getKey(this, path +: extraNames) - .map( - value => ev.read(value).map(Some(_)) - ) + .map(value => ev.read(value).map(Some(_))) .getOrElse(Configured.Ok(None)) } object Obj { diff --git a/metaconfig-core/shared/src/main/scala/metaconfig/Input.scala b/metaconfig-core/shared/src/main/scala/metaconfig/Input.scala index 63259480..2e0682d6 100644 --- a/metaconfig-core/shared/src/main/scala/metaconfig/Input.scala +++ b/metaconfig-core/shared/src/main/scala/metaconfig/Input.scala @@ -23,7 +23,8 @@ sealed abstract class Input(val path: String, val text: String) buf += (i + 1) i += 1 } - if (buf.last != chars.length) buf += chars.length // sentinel value used for binary search + if (buf.last != chars.length) + buf += chars.length // sentinel value used for binary search buf.toArray } diff --git a/metaconfig-core/shared/src/main/scala/metaconfig/cli/CliApp.scala b/metaconfig-core/shared/src/main/scala/metaconfig/cli/CliApp.scala index 809ac788..8c976215 100644 --- a/metaconfig-core/shared/src/main/scala/metaconfig/cli/CliApp.scala +++ b/metaconfig-core/shared/src/main/scala/metaconfig/cli/CliApp.scala @@ -47,9 +47,7 @@ case class CliApp( case Ok(value) => command.run(value, app) case NotOk(error) => - error.all.foreach { message => - app.error(message) - } + error.all.foreach { message => app.error(message) } 1 } case None => diff --git a/metaconfig-core/shared/src/main/scala/metaconfig/cli/TabCompleteCommand.scala b/metaconfig-core/shared/src/main/scala/metaconfig/cli/TabCompleteCommand.scala index 5e34a80f..67e960f1 100644 --- a/metaconfig-core/shared/src/main/scala/metaconfig/cli/TabCompleteCommand.scala +++ b/metaconfig-core/shared/src/main/scala/metaconfig/cli/TabCompleteCommand.scala @@ -45,8 +45,8 @@ object TabCompleteCommand extends Command[TabCompleteOptions]("tab-complete") { case flag :: last :: Nil => Some(flag) case _ => None } - val setting = secondLast.flatMap( - flag => inlined.get(Case.kebabToCamel(flag.stripPrefix("--"))) + val setting = secondLast.flatMap(flag => + inlined.get(Case.kebabToCamel(flag.stripPrefix("--"))) ) val context = TabCompletionContext( options.format, @@ -63,9 +63,7 @@ object TabCompleteCommand extends Command[TabCompleteOptions]("tab-complete") { } } private def renderCompletions(items: List[String], app: CliApp): Unit = { - items.foreach { item => - renderCompletion(TabCompletionItem(item), app) - } + items.foreach { item => renderCompletion(TabCompletionItem(item), app) } } private def renderCompletion(item: TabCompletionItem, app: CliApp): Unit = { diff --git a/metaconfig-core/shared/src/main/scala/metaconfig/internal/ConfGet.scala b/metaconfig-core/shared/src/main/scala/metaconfig/internal/ConfGet.scala index cc3bf07f..1573cb1b 100644 --- a/metaconfig-core/shared/src/main/scala/metaconfig/internal/ConfGet.scala +++ b/metaconfig-core/shared/src/main/scala/metaconfig/internal/ConfGet.scala @@ -54,7 +54,8 @@ object ConfGet { if (chars(i) == '\n') buf += (i + 1) i += 1 } - if (buf.last != chars.length) buf += chars.length // sentinel value used for binary search + if (buf.last != chars.length) + buf += chars.length // sentinel value used for binary search buf.toArray } diff --git a/metaconfig-core/shared/src/main/scala/metaconfig/internal/Macros.scala b/metaconfig-core/shared/src/main/scala/metaconfig/internal/Macros.scala index 97d65c0e..b5b4e80e 100644 --- a/metaconfig-core/shared/src/main/scala/metaconfig/internal/Macros.scala +++ b/metaconfig-core/shared/src/main/scala/metaconfig/internal/Macros.scala @@ -167,7 +167,8 @@ class Macros(val c: blackbox.Context) { Nil } - val finalAnnots = repeated ::: dynamic ::: flag ::: tabCompletePath ::: baseAnnots + val finalAnnots = + repeated ::: dynamic ::: flag ::: tabCompletePath ::: baseAnnots val fieldsParamTpe = c.internal.typeRef( NoPrefix, weakTypeOf[Surface[_]].typeSymbol, diff --git a/metaconfig-tests/jvm/src/test/scala/metaconfig/CodecRoundtripSuite.scala b/metaconfig-tests/jvm/src/test/scala/metaconfig/CodecRoundtripSuite.scala index 5b11c551..471d2274 100644 --- a/metaconfig-tests/jvm/src/test/scala/metaconfig/CodecRoundtripSuite.scala +++ b/metaconfig-tests/jvm/src/test/scala/metaconfig/CodecRoundtripSuite.scala @@ -12,15 +12,11 @@ class CodecRoundtripSuite extends munit.ScalaCheckSuite { } property("roundtrip AllTheAnnotations") { - forAll { a: AllTheAnnotations => - checkRoundtrip(a) - } + forAll { a: AllTheAnnotations => checkRoundtrip(a) } } property("roundtrip Outer") { - forAll { a: Outer => - checkRoundtrip(a) - } + forAll { a: Outer => checkRoundtrip(a) } } } diff --git a/metaconfig-tests/jvm/src/test/scala/metaconfig/sconfig/HoconPrinterRoundtripSuite.scala b/metaconfig-tests/jvm/src/test/scala/metaconfig/sconfig/HoconPrinterRoundtripSuite.scala index ed8ba728..e6cd1951 100644 --- a/metaconfig-tests/jvm/src/test/scala/metaconfig/sconfig/HoconPrinterRoundtripSuite.scala +++ b/metaconfig-tests/jvm/src/test/scala/metaconfig/sconfig/HoconPrinterRoundtripSuite.scala @@ -35,8 +35,6 @@ class HoconPrinterRoundtripSuite extends munit.ScalaCheckSuite { ) property("roundtrip") { - forAll { conf: ConfShow => - assertRoundtrip(conf.str) - } + forAll { conf: ConfShow => assertRoundtrip(conf.str) } } } diff --git a/metaconfig-tests/jvm/src/test/scala/metaconfig/sconfig/SconfigPropertySuite.scala b/metaconfig-tests/jvm/src/test/scala/metaconfig/sconfig/SconfigPropertySuite.scala index 575b1a5b..bce71b04 100644 --- a/metaconfig-tests/jvm/src/test/scala/metaconfig/sconfig/SconfigPropertySuite.scala +++ b/metaconfig-tests/jvm/src/test/scala/metaconfig/sconfig/SconfigPropertySuite.scala @@ -34,8 +34,6 @@ class SconfigPropertySuite extends munit.ScalaCheckSuite { ) property("roundtrip") { - forAll { (a: ConfShow, b: ConfShow) => - assertRoundtrip(a.str, b.str) - } + forAll { (a: ConfShow, b: ConfShow) => assertRoundtrip(a.str, b.str) } } } diff --git a/metaconfig-tests/jvm/src/test/scala/metaconfig/typesafeconfig/HoconPrinterRoundtripSuite.scala b/metaconfig-tests/jvm/src/test/scala/metaconfig/typesafeconfig/HoconPrinterRoundtripSuite.scala index 45d20b18..4fc3dd3d 100644 --- a/metaconfig-tests/jvm/src/test/scala/metaconfig/typesafeconfig/HoconPrinterRoundtripSuite.scala +++ b/metaconfig-tests/jvm/src/test/scala/metaconfig/typesafeconfig/HoconPrinterRoundtripSuite.scala @@ -21,9 +21,7 @@ class HoconPrinterRoundtripSuite extends munit.ScalaCheckSuite { } property("roundtrip") { - forAll { conf: ConfShow => - assertRoundtrip(conf.str) - } + forAll { conf: ConfShow => assertRoundtrip(conf.str) } } ignore( """ diff --git a/metaconfig-tests/jvm/src/test/scala/metaconfig/typesafeconfig/TypesafeConfigPropertySuite.scala b/metaconfig-tests/jvm/src/test/scala/metaconfig/typesafeconfig/TypesafeConfigPropertySuite.scala index 6b673e21..4b3e0d25 100644 --- a/metaconfig-tests/jvm/src/test/scala/metaconfig/typesafeconfig/TypesafeConfigPropertySuite.scala +++ b/metaconfig-tests/jvm/src/test/scala/metaconfig/typesafeconfig/TypesafeConfigPropertySuite.scala @@ -22,9 +22,7 @@ class TypesafeConfigPropertySuite extends munit.ScalaCheckSuite { } property("roundtrip") { - forAll { (a: ConfShow, b: ConfShow) => - assertRoundtrip(a.str, b.str) - } + forAll { (a: ConfShow, b: ConfShow) => assertRoundtrip(a.str, b.str) } } check( diff --git a/metaconfig-tests/shared/src/test/scala/metaconfig/DeriveSurfaceSuite.scala b/metaconfig-tests/shared/src/test/scala/metaconfig/DeriveSurfaceSuite.scala index 2a7da6ea..0d25f73e 100644 --- a/metaconfig-tests/shared/src/test/scala/metaconfig/DeriveSurfaceSuite.scala +++ b/metaconfig-tests/shared/src/test/scala/metaconfig/DeriveSurfaceSuite.scala @@ -70,9 +70,7 @@ class DeriveSurfaceSuite extends munit.FunSuite { assert(settings.settings.length == 4) val notIterable :: tail = settings.settings assert(!notIterable.isRepeated) - tail.foreach { setting => - assert(setting.isRepeated, setting.name) - } + tail.foreach { setting => assert(setting.isRepeated, setting.name) } } case class CustomTypePrinting(a: Int, b: Option[Int], c: List[String]) @@ -80,15 +78,11 @@ class DeriveSurfaceSuite extends munit.FunSuite { import pprint.TPrint implicit val intPrint = TPrint.literal[Int]("number") implicit def optionPrint[T](implicit ev: TPrint[T]): TPrint[Option[T]] = - TPrint.make { implicit colors => - "(" + ev.render + ")" - } + TPrint.make { implicit colors => "(" + ev.render + ")" } implicit def iterablePrint[C[x] <: Iterable[x], T]( implicit ev: TPrint[T] ): TPrint[C[T]] = - TPrint.make { implicit colors => - "[" + ev.render + " ...]" - } + TPrint.make { implicit colors => "[" + ev.render + " ...]" } implicit val surface = generic.deriveSurface[CustomTypePrinting] val a :: b :: c :: Nil = Settings[CustomTypePrinting].settings assert(a.tpe == "number")