diff --git a/scalafmt-core/shared/src/main/scala/org/scalafmt/config/Edition.scala b/scalafmt-core/shared/src/main/scala/org/scalafmt/config/Edition.scala index b35f8c20e4..eee1807e4d 100644 --- a/scalafmt-core/shared/src/main/scala/org/scalafmt/config/Edition.scala +++ b/scalafmt-core/shared/src/main/scala/org/scalafmt/config/Edition.scala @@ -1,24 +1,33 @@ package org.scalafmt.config +import java.time.YearMonth + import metaconfig.{Conf, ConfDecoder, ConfEncoder, Configured} -case class Edition(year: Int, month: Int) +class Edition(val ym: YearMonth) extends AnyVal { + override def toString: String = ym.toString +} object Edition { - val Latest = Edition(Int.MaxValue, Int.MaxValue) + + def apply(year: Int, month: Int): Edition = + new Edition(YearMonth.of(year, month)) + + val Latest = Edition(9999, 12) + implicit val ordering: Ordering[Edition] = - Ordering.by[Edition, (Int, Int)](e => e.year -> e.month) + (x: Edition, y: Edition) => x.ym.compareTo(y.ym) + lazy val format = "(\\d{4})-(\\d{1,2})".r implicit val decoder: ConfDecoder[Edition] = ConfDecoder.instanceExpect("'$year-$month', for example '2019-08'") { case Conf.Str(format(year, month)) => - Configured.ok(Edition(year.toInt, month.toInt)) + try Configured.ok(Edition(year.toInt, month.toInt)) + catch { case e: Exception => Configured.error(e.getMessage) } case Conf.Str("latest") => Configured.ok(Latest) } implicit val encoder: ConfEncoder[Edition] = - ConfEncoder.instance(edition => - Conf.Str(f"${edition.year}%d-${edition.month}%02d") - ) + ConfEncoder.instance(edition => Conf.Str(edition.ym.toString)) } diff --git a/scalafmt-tests/src/test/scala/org/scalafmt/EditionTest.scala b/scalafmt-tests/src/test/scala/org/scalafmt/EditionTest.scala index c41445cbbb..4a002f6449 100644 --- a/scalafmt-tests/src/test/scala/org/scalafmt/EditionTest.scala +++ b/scalafmt-tests/src/test/scala/org/scalafmt/EditionTest.scala @@ -6,7 +6,7 @@ import org.scalafmt.config.Edition import org.scalafmt.util.DiffAssertions class EditionTest extends AnyFunSuite with DiffAssertions { - def check(original: String, expected: Edition): Unit = { + def check(original: String, expected: Edition, expectedStr: String): Unit = { test(original) { val conf = Conf.Str(original) val obtained = Edition.decoder.read(conf).get @@ -14,6 +14,7 @@ class EditionTest extends AnyFunSuite with DiffAssertions { Edition.encoder.write(obtained).toString(), Edition.encoder.write(expected).toString() ) + assertNoDiff(expected.toString, expectedStr) } } def checkError(original: String, expectedError: String): Unit = { @@ -26,9 +27,9 @@ class EditionTest extends AnyFunSuite with DiffAssertions { } } } - check("2019-09", Edition(2019, 9)) - check("2019-9", Edition(2019, 9)) - check("2019-10", Edition(2019, 10)) + check("2019-09", Edition(2019, 9), "2019-09") + check("2019-9", Edition(2019, 9), "2019-09") + check("2019-10", Edition(2019, 10), "2019-10") checkError( "2019-invalid", """|Type mismatch;