From 27e4d07f48e062593418a6cc2d267dbaa52e0a13 Mon Sep 17 00:00:00 2001 From: Ondra Pelech Date: Wed, 12 May 2021 09:46:41 +0200 Subject: [PATCH] Update to the latest standard (#258) --- .github/CODEOWNERS | 1 - .github/release-drafter.yml | 47 +- .github/renovate.json | 13 + .github/workflows/auto-approve.yml | 4 +- .github/workflows/ci.yml | 49 ++- .github/workflows/{mdoc.yml => site.yml} | 7 +- .mergify.yml | 26 ++ .nvmrc | 2 +- .scala-steward.conf | 1 - .scalafix.conf | 27 ++ .scalafmt.conf | 2 +- .../scala/zio/logging/FilterBenchmarks.scala | 4 +- build.sbt | 63 ++- ...PlatformSpecificLogAppenderModifiers.scala | 2 +- .../scala/zio/logging/LogAnnotation.scala | 16 +- .../zio/logging/LogDatetimeFormatter.scala | 2 +- .../src/main/scala/zio/logging/Logging.scala | 6 +- .../scala/zio/logging/LogFilteringSpec.scala | 4 +- .../test/scala/zio/logging/LoggerSpec.scala | 11 +- .../src/main/scala/zio/logging/Examples.scala | 6 +- .../src/main/scala/zio/logging/Slf4jMdc.scala | 14 +- .../zio/logging/js/ConsoleLoggerSpec.scala | 2 +- .../scala/zio/logging/js/HTTPLogger.scala | 9 +- project/BuildHelper.scala | 400 ++++++++++++++---- project/build.properties | 2 +- project/plugins.sbt | 30 +- sbt | 21 +- .../scala-2/org/slf4j/impl/ZioLogger.scala | 2 +- .../zio/logging/slf4j/bridge/package.scala | 2 +- .../slf4j/bridge/Slf4jBridgeSpec.scala | 3 +- .../scala/zio/logging/slf4j/Slf4jLogger.scala | 20 +- .../zio/logging/slf4j/Slf4jLoggerTest.scala | 13 +- .../zio/logging/slf4j/TestAppender.scala | 3 +- website/core/Footer.js | 11 + website/siteConfig.js | 8 +- 35 files changed, 601 insertions(+), 232 deletions(-) create mode 100644 .github/renovate.json rename .github/workflows/{mdoc.yml => site.yml} (73%) create mode 100644 .mergify.yml delete mode 100644 .scala-steward.conf create mode 100644 .scalafix.conf diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index c639d327..9bb56c7c 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,2 +1 @@ * @zio/zio-logging - diff --git a/.github/release-drafter.yml b/.github/release-drafter.yml index 7e2bf446..f613ef99 100644 --- a/.github/release-drafter.yml +++ b/.github/release-drafter.yml @@ -1,19 +1,36 @@ -name-template: 'v$NEXT_PATCH_VERSION' -tag-template: 'v$NEXT_PATCH_VERSION' +name-template: 'v$RESOLVED_VERSION' +tag-template: 'v$RESOLVED_VERSION' +template: | + # What's Changed + $CHANGES categories: - - title: '🚀 Features' - labels: - - 'feature' - - title: '🐛 Bug Fixes' + - title: 'Breaking' + label: 'type: breaking' + - title: 'New' + label: 'type: feature' + - title: 'Bug Fixes' + label: 'type: bug' + - title: 'Maintenance' + label: 'type: maintenance' + - title: 'Documentation' + label: 'type: docs' + - title: 'Dependency Updates' + label: 'type: dependencies' + +version-resolver: + major: labels: - - 'bug' - - title: '🧰 Maintenance' + - 'type: breaking' + minor: labels: - - 'build' - - title: '🌱 Dependency Updates' + - 'type: feature' + patch: labels: - - 'dependency-update' -change-template: '- $TITLE @$AUTHOR (#$NUMBER)' -template: | - ## Changes - $CHANGES + - 'type: bug' + - 'type: maintenance' + - 'type: docs' + - 'type: dependencies' + - 'type: security' + +exclude-labels: + - 'skip-changelog' diff --git a/.github/renovate.json b/.github/renovate.json new file mode 100644 index 00000000..86e50ef6 --- /dev/null +++ b/.github/renovate.json @@ -0,0 +1,13 @@ +{ + "automerge": true, + "rebaseWhen": "conflicted", + "labels": ["type: dependencies"], + "packageRules": [ + { + "matchManagers": [ + "sbt" + ], + "enabled": false + } + ] +} diff --git a/.github/workflows/auto-approve.yml b/.github/workflows/auto-approve.yml index e5a14bd4..67c00644 100644 --- a/.github/workflows/auto-approve.yml +++ b/.github/workflows/auto-approve.yml @@ -7,7 +7,7 @@ jobs: auto-approve: runs-on: ubuntu-20.04 steps: - - uses: hmarr/auto-approve-action@v2.0.0 - if: github.actor == 'scala-steward' + - uses: hmarr/auto-approve-action@v2.1.0 + if: github.actor == 'scala-steward' || github.actor == 'renovate[bot]' with: github-token: "${{ secrets.GITHUB_TOKEN }}" diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9c2e2988..9b655d2b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,5 +1,9 @@ name: CI +env: + JDK_JAVA_OPTIONS: -XX:+PrintCommandLineFlags # JDK_JAVA_OPTIONS is _the_ env. variable to use for modern Java + JVM_OPTS: -XX:+PrintCommandLineFlags # for Java 8 only (sadly, it is not modern enough for JDK_JAVA_OPTIONS) + on: pull_request: push: @@ -11,8 +15,7 @@ on: jobs: lint: runs-on: ubuntu-20.04 - strategy: - fail-fast: false + timeout-minutes: 30 steps: - name: Checkout current branch uses: actions/checkout@v2.3.4 @@ -21,17 +24,31 @@ jobs: - name: Setup Scala and Java uses: olafurpg/setup-scala@v10 - name: Cache scala dependencies - uses: coursier/cache-action@v5 + uses: coursier/cache-action@v6 - name: Lint code - run: sbt check + run: sbt check + + mdoc: + runs-on: ubuntu-20.04 + timeout-minutes: 60 + steps: + - name: Checkout current branch + uses: actions/checkout@v2.3.4 + - name: Setup Scala and Java + uses: olafurpg/setup-scala@v10 + - name: Cache scala dependencies + uses: coursier/cache-action@v6 + - name: Check Document Generation + run: sbt docs/mdoc test: runs-on: ubuntu-20.04 + timeout-minutes: 30 strategy: fail-fast: false matrix: java: ['adopt@1.8', 'adopt@1.11'] - scala: ['2.11.12', '2.12.13', '2.13.4', "3.0.0-RC1"] + scala: ['2.11.12', '2.12.13', '2.13.5', '3.0.0-RC3'] platform: ['JVM', 'JS'] steps: - name: Checkout current branch @@ -43,30 +60,38 @@ jobs: with: java-version: ${{ matrix.java }} - name: Cache scala dependencies - uses: coursier/cache-action@v5 + uses: coursier/cache-action@v6 - name: Run tests - if: matrix.scala != '3.0.0-RC1' + if: ${{ !startsWith(matrix.scala, '3.0.') }} run: sbt ++${{ matrix.scala }}! test${{ matrix.platform }} - name: Run dotty tests - if: matrix.scala == '3.0.0-RC1' && matrix.platform == 'JVM' + if: ${{ startsWith(matrix.scala, '3.0.') && matrix.platform == 'JVM' }} run: sbt ++${{ matrix.scala }}! testJVM - name: Compile additional subprojects - if: matrix.scala != '3.0.0-RC1' + if: ${{ !startsWith(matrix.scala, '3.0.') }} run: sbt ++${{ matrix.scala }}! examples/compile docs/compile benchmarks/compile + ci: + runs-on: ubuntu-20.04 + needs: [lint, mdoc, test] + steps: + - name: Report successful build + run: echo "ci passed" + publish: runs-on: ubuntu-20.04 - needs: [lint, test] + timeout-minutes: 30 + needs: [ci] if: github.event_name != 'pull_request' steps: - name: Checkout current branch uses: actions/checkout@v2.3.4 with: fetch-depth: 0 - - name: Setup Scala and Java + - name: Setup Scala and Java uses: olafurpg/setup-scala@v10 - name: Cache scala dependencies - uses: coursier/cache-action@v5 + uses: coursier/cache-action@v6 - name: Release artifacts run: sbt ci-release env: diff --git a/.github/workflows/mdoc.yml b/.github/workflows/site.yml similarity index 73% rename from .github/workflows/mdoc.yml rename to .github/workflows/site.yml index 08925ef8..d2f502c4 100644 --- a/.github/workflows/mdoc.yml +++ b/.github/workflows/site.yml @@ -3,15 +3,18 @@ name: Website on: push: branches: [master] - tags: ["*"] + release: + types: + - published jobs: publish: runs-on: ubuntu-20.04 + timeout-minutes: 30 + if: github.event_name != 'pull_request' steps: - uses: actions/checkout@v2 - uses: olafurpg/setup-scala@v10 - - uses: olafurpg/setup-gpg@v3 - run: sbt docs/docusaurusPublishGhpages env: GIT_DEPLOY_KEY: ${{ secrets.GIT_DEPLOY_KEY }} diff --git a/.mergify.yml b/.mergify.yml new file mode 100644 index 00000000..4cff17a5 --- /dev/null +++ b/.mergify.yml @@ -0,0 +1,26 @@ +pull_request_rules: + - name: assign and label scala-steward's PRs + conditions: + - author=scala-steward + actions: + assign: + users: ["@zio/zio-logging"] + label: + add: ["type: dependencies"] + - name: label scala-steward's breaking PRs + conditions: + - author=scala-steward + - "body~=(labels: library-update, semver-major)|(labels: sbt-plugin-update, semver-major)" + actions: + label: + add: ["type: breaking"] + - name: merge Scala Steward's PRs + conditions: + - base=master + - author=scala-steward + - "body~=(labels: library-update, semver-minor)|(labels: library-update, semver-patch)|(labels: sbt-plugin-update, semver-minor)|(labels: sbt-plugin-update, semver-patch)|(labels: scalafix-rule-update)|(labels: test-library-update)" + - "status-success=license/cla" + - "status-success=ci" + actions: + merge: + method: squash diff --git a/.nvmrc b/.nvmrc index 5e0613fa..6b17d228 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -v10.8.0 +14.16.1 diff --git a/.scala-steward.conf b/.scala-steward.conf deleted file mode 100644 index ad640cd0..00000000 --- a/.scala-steward.conf +++ /dev/null @@ -1 +0,0 @@ -updates.ignore = [ { groupId = "com.jsuereth", artifactId = "sbt-pgp" } ] diff --git a/.scalafix.conf b/.scalafix.conf new file mode 100644 index 00000000..b090394c --- /dev/null +++ b/.scalafix.conf @@ -0,0 +1,27 @@ +rules = [ + Disable + DisableSyntax + ExplicitResultTypes + LeakingImplicitClassVal + NoAutoTupling + NoValInForComprehension + OrganizeImports + ProcedureSyntax + RemoveUnused +] + +Disable { + ifSynthetic = [ + "scala/Option.option2Iterable" + "scala/Predef.any2stringadd" + ] +} + +OrganizeImports { + # Allign with IntelliJ IDEA so that they don't fight each other + groupedImports = Merge +} + +RemoveUnused { + imports = false // handled by OrganizeImports +} diff --git a/.scalafmt.conf b/.scalafmt.conf index 9353caae..d30a2d0d 100644 --- a/.scalafmt.conf +++ b/.scalafmt.conf @@ -11,4 +11,4 @@ spaces { } optIn.annotationNewlines = true -rewrite.rules = [SortImports, RedundantBraces] +rewrite.rules = [RedundantBraces] diff --git a/benchmarks/src/main/scala/zio/logging/FilterBenchmarks.scala b/benchmarks/src/main/scala/zio/logging/FilterBenchmarks.scala index 5af52bc3..75f939a4 100644 --- a/benchmarks/src/main/scala/zio/logging/FilterBenchmarks.scala +++ b/benchmarks/src/main/scala/zio/logging/FilterBenchmarks.scala @@ -38,7 +38,7 @@ class FilterBenchmarks { (handWrittenFilteredAppender >>> Logging.make).build.useNow } - val filterTreeFunction = + val filterTreeFunction: (LogContext, => Any) => Boolean = filterBy(LogLevel.Debug, "a.b.c" -> LogLevel.Info, "a.b.d" -> LogLevel.Warn, "e" -> LogLevel.Info) val filterTreeAppender: ZLayer[Any, Nothing, Appender[String]] = LogAppender @@ -69,7 +69,7 @@ class FilterBenchmarks { } yield logging } - val names = List( + val names: List[List[String]] = List( List("a"), List("a", "b"), List("a", "b", "c"), diff --git a/build.sbt b/build.sbt index 525868f1..6f30a4e4 100644 --- a/build.sbt +++ b/build.sbt @@ -16,27 +16,16 @@ inThisBuild( "rzbikson@gmail.com", url("https://github.com/pshemass") ) - ), - pgpPassphrase := sys.env.get("PGP_PASSWORD").map(_.toArray), - pgpPublicRing := file("/tmp/public.asc"), - pgpSecretRing := file("/tmp/secret.asc"), - scmInfo := Some( - ScmInfo( - url("https://github.com/zio/zio-logging/"), - "scm:git:git@github.com:zio/zio-logging.git" - ) ) ) ) -ThisBuild / publishTo := sonatypePublishToBundle.value - -val ZioVersion = "1.0.5" +val ZioVersion = "1.0.7" val scalaJavaTimeVersion = "2.0.0-RC5" val slf4jVersion = "1.7.30" -addCommandAlias("fmt", "all scalafmtSbt scalafmt test:scalafmt") -addCommandAlias("check", "all scalafmtSbtCheck scalafmtCheck test:scalafmtCheck") +addCommandAlias("fix", "; all compile:scalafix test:scalafix; all scalafmtSbt scalafmtAll") +addCommandAlias("check", "; scalafmtSbtCheck; scalafmtCheckAll; compile:scalafix --check; test:scalafix --check") addCommandAlias( "testJVM", @@ -51,10 +40,9 @@ addCommandAlias( lazy val root = project .in(file(".")) .settings( - crossScalaVersions := Nil, - skip in publish := true + publish / skip := true ) - .aggregate(coreJVM, coreJS, slf4j, slf4jBridge, jsconsole, jshttp) + .aggregate(coreJVM, coreJS, slf4j, slf4jBridge, jsconsole, jshttp, benchmarks, docs, examples) lazy val core = crossProject(JSPlatform, JVMPlatform) .crossType(CrossType.Full) @@ -62,19 +50,19 @@ lazy val core = crossProject(JSPlatform, JVMPlatform) .settings(stdSettings("zio-logging")) .settings( libraryDependencies ++= Seq( - "dev.zio" %%% "zio" % ZioVersion, - "org.scala-lang.modules" %%% "scala-collection-compat" % "2.4.3", - "dev.zio" %%% "zio-test" % ZioVersion % Test, - "dev.zio" %%% "zio-test-sbt" % ZioVersion % Test + "dev.zio" %%% "zio" % ZioVersion, + ("org.scala-lang.modules" %%% "scala-collection-compat" % "2.4.3").cross(CrossVersion.for3Use2_13), + "dev.zio" %%% "zio-test" % ZioVersion % Test, + "dev.zio" %%% "zio-test-sbt" % ZioVersion % Test ), testFrameworks := Seq(new TestFramework("zio.test.sbt.ZTestFramework")) ) .jvmSettings( - fork in Test := true, - fork in run := true + Test / fork := true, + run / fork := true ) lazy val coreJVM = core.jvm - .settings(scala3Settings) + .settings(dottySettings) lazy val coreJS = core.js.settings( libraryDependencies += "io.github.cquiroz" %%% "scala-java-time" % "2.2.2" % Test ) @@ -83,7 +71,7 @@ lazy val slf4j = project .in(file("slf4j")) .dependsOn(coreJVM) .settings(stdSettings("zio-logging-slf4j")) - .settings(scala3Settings) + .settings(dottySettings) .settings( libraryDependencies ++= Seq( "org.slf4j" % "slf4j-api" % slf4jVersion, @@ -99,7 +87,7 @@ lazy val slf4jBridge = project .in(file("slf4j-bridge")) .dependsOn(coreJVM % "compile->compile;test->test") .settings(stdSettings("zio-logging-slf4j-bridge")) - .settings(scala3Settings) + .settings(dottySettings) .settings( libraryDependencies ++= Seq( "org.slf4j" % "slf4j-api" % slf4jVersion, @@ -148,27 +136,26 @@ lazy val benchmarks = project lazy val docs = project .in(file("zio-logging-docs")) .settings( - skip in publish := true, - moduleName := "docs", -// unusedCompileDependenciesFilter -= moduleFilter("org.scalameta", "mdoc"), + publish / skip := true, + moduleName := "zio-logging-docs", scalacOptions -= "-Yno-imports", scalacOptions -= "-Xfatal-warnings", - scalacOptions ~= { _.filterNot(_.startsWith("-Ywarn")) }, - scalacOptions ~= { _.filterNot(_.startsWith("-Xlint")) }, - libraryDependencies ++= Seq( - ("com.github.ghik" % "silencer-lib" % SilencerVersion % Provided).cross(CrossVersion.full) - ) + ScalaUnidoc / unidoc / unidocProjectFilter := inProjects(coreJVM, slf4j, slf4jBridge), + ScalaUnidoc / unidoc / target := (LocalRootProject / baseDirectory).value / "website" / "static" / "api", + cleanFiles += (ScalaUnidoc / unidoc / target).value, + docusaurusCreateSite := docusaurusCreateSite.dependsOn(Compile / unidoc).value, + docusaurusPublishGhpages := docusaurusPublishGhpages.dependsOn(Compile / unidoc).value ) - .dependsOn(coreJVM, slf4j) - .enablePlugins(MdocPlugin, DocusaurusPlugin) + .dependsOn(coreJVM, slf4j, slf4jBridge) + .enablePlugins(MdocPlugin, DocusaurusPlugin, ScalaUnidocPlugin) lazy val examples = project .in(file("examples")) .dependsOn(slf4j) .settings(stdSettings("zio-logging-examples")) - .settings(scala3Settings) + .settings(dottySettings) .settings( - skip in publish := true, + publish / skip := true, libraryDependencies ++= Seq( "ch.qos.logback" % "logback-classic" % "1.2.3", "net.logstash.logback" % "logstash-logback-encoder" % "6.6" diff --git a/core/jvm/src/main/scala/zio/logging/PlatformSpecificLogAppenderModifiers.scala b/core/jvm/src/main/scala/zio/logging/PlatformSpecificLogAppenderModifiers.scala index 81a64ce2..43dc1205 100644 --- a/core/jvm/src/main/scala/zio/logging/PlatformSpecificLogAppenderModifiers.scala +++ b/core/jvm/src/main/scala/zio/logging/PlatformSpecificLogAppenderModifiers.scala @@ -1,12 +1,12 @@ package zio.logging -import zio.{ Tag, UIO, ZLayer } import zio.internal.Tracing import zio.internal.stacktracer.Tracer import zio.internal.stacktracer.ZTraceElement.{ NoLocation, SourceLocation } import zio.internal.stacktracer.impl.AkkaLineNumbersTracer import zio.internal.tracing.TracingConfig import zio.logging.LogAppender.Service +import zio.{ Tag, UIO, ZLayer } trait PlatformSpecificLogAppenderModifiers { private val tracing = Tracing(Tracer.globallyCached(new AkkaLineNumbersTracer), TracingConfig.enabled) diff --git a/core/shared/src/main/scala/zio/logging/LogAnnotation.scala b/core/shared/src/main/scala/zio/logging/LogAnnotation.scala index f77a0e94..721bbbfd 100644 --- a/core/shared/src/main/scala/zio/logging/LogAnnotation.scala +++ b/core/shared/src/main/scala/zio/logging/LogAnnotation.scala @@ -1,9 +1,9 @@ package zio.logging -import java.time.OffsetDateTime - import zio.Cause +import java.time.OffsetDateTime +import java.{ util => ju } import scala.reflect.ClassTag /** @@ -38,7 +38,7 @@ object LogAnnotation { /** * The `CorrelationId` annotation keeps track of correlation id. */ - val CorrelationId = LogAnnotation[Option[java.util.UUID]]( + val CorrelationId: LogAnnotation[Option[ju.UUID]] = LogAnnotation[Option[java.util.UUID]]( name = "correlation-id", initialValue = None, combine = (_, r) => r, @@ -48,17 +48,17 @@ object LogAnnotation { /** * The `Level` annotation keeps track of log levels. */ - val Level = LogAnnotation[LogLevel]("level", LogLevel.Info, (_, r) => r, _.render) + val Level: LogAnnotation[LogLevel] = LogAnnotation[LogLevel]("level", LogLevel.Info, (_, r) => r, _.render) /** * The `Name` annotation keeps track of logger names. */ - val Name = LogAnnotation[List[String]]("name", Nil, _ ++ _, _.mkString(".")) + val Name: LogAnnotation[List[String]] = LogAnnotation[List[String]]("name", Nil, _ ++ _, _.mkString(".")) /** * The `Throwable` annotation keeps track of a throwable. */ - val Throwable = + val Throwable: LogAnnotation[Option[Throwable]] = LogAnnotation[Option[Throwable]]( name = "throwable", initialValue = None, @@ -69,7 +69,7 @@ object LogAnnotation { /** * The `Cause` annotation keeps track of a Cause. */ - val Cause = + val Cause: LogAnnotation[Option[Cause[Any]]] = LogAnnotation[Option[Cause[Any]]]( name = "cause", initialValue = None, @@ -80,7 +80,7 @@ object LogAnnotation { /** * Log timestamp */ - val Timestamp = LogAnnotation[OffsetDateTime]( + val Timestamp: LogAnnotation[OffsetDateTime] = LogAnnotation[OffsetDateTime]( name = "timestamp", initialValue = OffsetDateTime.MIN, combine = (_, newValue) => newValue, diff --git a/core/shared/src/main/scala/zio/logging/LogDatetimeFormatter.scala b/core/shared/src/main/scala/zio/logging/LogDatetimeFormatter.scala index c6f0ac1b..c859374a 100644 --- a/core/shared/src/main/scala/zio/logging/LogDatetimeFormatter.scala +++ b/core/shared/src/main/scala/zio/logging/LogDatetimeFormatter.scala @@ -5,7 +5,7 @@ import java.time.temporal.ChronoField._ import java.util.Locale object LogDatetimeFormatter { - val humanReadableDateTimeFormatter = new DateTimeFormatterBuilder() + val humanReadableDateTimeFormatter: DateTimeFormatter = new DateTimeFormatterBuilder() .parseCaseInsensitive() .appendValue(YEAR, 4, 10, SignStyle.EXCEEDS_PAD) .appendLiteral('-') diff --git a/core/shared/src/main/scala/zio/logging/Logging.scala b/core/shared/src/main/scala/zio/logging/Logging.scala index 57f89ff1..2c76d991 100644 --- a/core/shared/src/main/scala/zio/logging/Logging.scala +++ b/core/shared/src/main/scala/zio/logging/Logging.scala @@ -1,13 +1,13 @@ package zio.logging -import java.nio.charset.{ Charset, StandardCharsets } -import java.nio.file.Path - import zio._ import zio.clock._ import zio.console.Console import zio.logging.Logger.LoggerWithFormat +import java.nio.charset.{ Charset, StandardCharsets } +import java.nio.file.Path + object Logging { /** diff --git a/core/shared/src/test/scala/zio/logging/LogFilteringSpec.scala b/core/shared/src/test/scala/zio/logging/LogFilteringSpec.scala index 26bebc90..7bf4264f 100644 --- a/core/shared/src/test/scala/zio/logging/LogFilteringSpec.scala +++ b/core/shared/src/test/scala/zio/logging/LogFilteringSpec.scala @@ -21,14 +21,14 @@ object LogFilteringSpec extends DefaultRunnableSpec { ): TestResult = assert(filter(makeCtx(name, level), ""))(expectation ?? s"$name with $level") - val filter = filterBy( + val filter: (LogContext, => Any) => Boolean = filterBy( LogLevel.Debug, "a" -> LogLevel.Info, "a.b.c" -> LogLevel.Warn, "e.f" -> LogLevel.Error ) - override def spec = + override def spec: Spec[Environment, TestFailure[Nothing], TestSuccess] = suite("Log filtering")( test("can be built from list of nodes") { testFilter(filter, "x", LogLevel.Debug, isTrue) && diff --git a/core/shared/src/test/scala/zio/logging/LoggerSpec.scala b/core/shared/src/test/scala/zio/logging/LoggerSpec.scala index 2cc811a3..5e2511bd 100644 --- a/core/shared/src/test/scala/zio/logging/LoggerSpec.scala +++ b/core/shared/src/test/scala/zio/logging/LoggerSpec.scala @@ -1,11 +1,12 @@ package zio.logging -import java.time.OffsetDateTime -import java.util.UUID - -import zio.{ FiberRef, Has, Layer, Ref, UIO, ZIO, ZLayer } import zio.test.Assertion._ import zio.test._ +import zio.test.environment.TestEnvironment +import zio.{ FiberRef, Has, Layer, Ref, UIO, ZIO, ZLayer } + +import java.time.{ DateTimeException, OffsetDateTime } +import java.util.UUID object LoggerSpec extends DefaultRunnableSpec { @@ -38,7 +39,7 @@ object LoggerSpec extends DefaultRunnableSpec { def lines: ZIO[TestLogging, Nothing, Vector[(LogContext, String)]] = ZIO.accessM[TestLogging](_.get.lines) } - def spec = + def spec: Spec[TestEnvironment, TestFailure[DateTimeException], TestSuccess] = suite("logger")( testM("log with log level") { log.debug("test") *> diff --git a/examples/src/main/scala/zio/logging/Examples.scala b/examples/src/main/scala/zio/logging/Examples.scala index c6497c60..2fc2fa6a 100644 --- a/examples/src/main/scala/zio/logging/Examples.scala +++ b/examples/src/main/scala/zio/logging/Examples.scala @@ -4,7 +4,7 @@ import zio._ import zio.logging.slf4j.Slf4jLogger object Examples extends zio.App { - val correlationId = LogAnnotation[String]( + val correlationId: LogAnnotation[String] = LogAnnotation[String]( name = "correlationId", initialValue = "undefined-correlation-id", combine = (_, newValue) => newValue, @@ -13,11 +13,11 @@ object Examples extends zio.App { val logFormat = "[correlation-id = %s] %s" - val env = + val env: ULayer[Logging] = Slf4jLogger.make((context, message) => logFormat.format(context(correlationId), message)) import zio.duration._ - override def run(args: List[String]) = + override def run(args: List[String]): URIO[ZEnv, ExitCode] = (for { fiber <- log.locally(correlationId("1234"))(ZIO.unit).fork _ <- log.info("info message with correlation id from modifyLogger") diff --git a/examples/src/main/scala/zio/logging/Slf4jMdc.scala b/examples/src/main/scala/zio/logging/Slf4jMdc.scala index f7e531e0..8467835d 100644 --- a/examples/src/main/scala/zio/logging/Slf4jMdc.scala +++ b/examples/src/main/scala/zio/logging/Slf4jMdc.scala @@ -1,23 +1,23 @@ package zio.logging -import java.util.UUID - -import zio.logging.slf4j.Slf4jLogger -import zio.clock.Clock import zio._ +import zio.clock.Clock import zio.duration._ +import zio.logging.slf4j.Slf4jLogger + +import java.util.UUID object Slf4jMdc extends App { - val userId = LogAnnotation[UUID]( + val userId: LogAnnotation[UUID] = LogAnnotation[UUID]( name = "user-id", initialValue = UUID.fromString("0-0-0-0-0"), combine = (_, newValue) => newValue, render = _.toString ) - val logLayer = Slf4jLogger.makeWithAnnotationsAsMdc(List(userId)) - val users = List.fill(2)(UUID.randomUUID()) + val logLayer: ULayer[Logging] = Slf4jLogger.makeWithAnnotationsAsMdc(List(userId)) + val users: List[UUID] = List.fill(2)(UUID.randomUUID()) override def run(args: List[String]): ZIO[zio.ZEnv, Nothing, ExitCode] = (for { diff --git a/jsconsole/src/test/scala/zio/logging/js/ConsoleLoggerSpec.scala b/jsconsole/src/test/scala/zio/logging/js/ConsoleLoggerSpec.scala index c6081240..c36b653e 100644 --- a/jsconsole/src/test/scala/zio/logging/js/ConsoleLoggerSpec.scala +++ b/jsconsole/src/test/scala/zio/logging/js/ConsoleLoggerSpec.scala @@ -1,7 +1,7 @@ package zio.logging.js import zio.ZIO -import zio.logging.{ log, LogLevel } +import zio.logging.{ LogLevel, log } import zio.test.Assertion.equalTo import zio.test._ diff --git a/jshttp/src/main/scala/zio/logging/js/HTTPLogger.scala b/jshttp/src/main/scala/zio/logging/js/HTTPLogger.scala index 96f8a8d2..68a974f2 100644 --- a/jshttp/src/main/scala/zio/logging/js/HTTPLogger.scala +++ b/jshttp/src/main/scala/zio/logging/js/HTTPLogger.scala @@ -1,13 +1,12 @@ package zio.logging.js -import java.time.OffsetDateTime -import java.util.UUID - import org.scalajs.dom.ext.Ajax -import zio.{ ZIO, ZLayer } -import zio.clock.{ currentDateTime, Clock } +import zio.clock.{ Clock, currentDateTime } import zio.logging.{ LogAnnotation, LogAppender, LogContext, LogFormat, LogLevel, Logging } +import zio.{ ZIO, ZLayer } +import java.time.OffsetDateTime +import java.util.UUID import scala.scalajs.js import scala.scalajs.js.JSON diff --git a/project/BuildHelper.scala b/project/BuildHelper.scala index 2e00c3aa..24533fbd 100644 --- a/project/BuildHelper.scala +++ b/project/BuildHelper.scala @@ -1,109 +1,351 @@ -import sbt._ +import explicitdeps.ExplicitDepsPlugin.autoImport._ +import org.portablescala.sbtplatformdeps.PlatformDepsPlugin.autoImport._ import sbt.Keys._ -import dotty.tools.sbtplugin.DottyPlugin.autoImport._ +import sbt._ +import sbtbuildinfo.BuildInfoKeys._ +import sbtbuildinfo._ +import sbtcrossproject.CrossPlugin.autoImport._ +import scalafix.sbt.ScalafixPlugin.autoImport._ object BuildHelper { - def stdSettings(prjName: String) = - Seq( - name := s"$prjName", - crossScalaVersions := Seq(Scala211, Scala212, Scala213), - scalaVersion in ThisBuild := Scala212, - scalacOptions := CommonOpts ++ extraOptions(scalaVersion.value), - libraryDependencies ++= { - if (isDotty.value) - Seq( - ("com.github.ghik" % s"silencer-lib_$Scala213" % SilencerVersion % Provided) - .withDottyCompat(scalaVersion.value) - ) - else - Seq( - "com.github.ghik" % "silencer-lib" % SilencerVersion % Provided cross CrossVersion.full, - compilerPlugin("com.github.ghik" % "silencer-plugin" % SilencerVersion cross CrossVersion.full) - ) - }, - incOptions ~= (_.withLogRecompileOnMacro(false)) - ) + private val versions: Map[String, String] = { + import org.snakeyaml.engine.v2.api.{ Load, LoadSettings } + + import java.util.{ List => JList, Map => JMap } + import scala.jdk.CollectionConverters._ - final private val Scala211 = "2.11.12" - final private val Scala212 = "2.12.13" - final private val Scala213 = "2.13.4" - final private val Scala3 = "3.0.0-RC1" + val doc = new Load(LoadSettings.builder().build()) + .loadFromReader(scala.io.Source.fromFile(".github/workflows/ci.yml").bufferedReader()) + val yaml = doc.asInstanceOf[JMap[String, JMap[String, JMap[String, JMap[String, JMap[String, JList[String]]]]]]] + val list = yaml.get("jobs").get("test").get("strategy").get("matrix").get("scala").asScala + list.map(v => (v.split('.').take(2).mkString("."), v)).toMap + } + val Scala211: String = versions("2.11") + val Scala212: String = versions("2.12") + val Scala213: String = versions("2.13") + val ScalaDotty: String = versions("3.0") - final val scala3Settings = Seq( - crossScalaVersions += Scala3 + val SilencerVersion = "1.7.3" + + private val stdOptions = Seq( + "-deprecation", + "-encoding", + "UTF-8", + "-feature", + "-unchecked" + ) ++ { + if (sys.env.contains("CI")) { + Seq("-Xfatal-warnings") + } else { + Nil // to enable Scalafix locally + } + } + + private val std2xOptions = Seq( + "-language:higherKinds", + "-language:existentials", + "-explaintypes", + "-Yrangepos", + "-Xlint:_,-missing-interpolator,-type-parameter-shadow", + "-Ywarn-numeric-widen", + "-Ywarn-value-discard" ) - final val SilencerVersion = "1.7.3" + private def optimizerOptions(optimize: Boolean) = + if (optimize) + Seq( + "-opt:l:inline", + "-opt-inline-from:zio.internal.**" + ) + else Nil - final private val CommonOpts = + def buildInfoSettings(packageName: String) = Seq( - "-encoding", - "UTF-8", - "-feature", - "-language:higherKinds", - "-language:existentials", - "-unchecked", - "-deprecation", - "-Xfatal-warnings" + buildInfoKeys := Seq[BuildInfoKey](organization, moduleName, name, version, scalaVersion, sbtVersion, isSnapshot), + buildInfoPackage := packageName ) - final private val CommonOpts2x = - Seq( - "-explaintypes", - "-Yrangepos", - "-Xlint:_,-type-parameter-shadow", - "-Xsource:2.13", - "-Ywarn-dead-code", - "-Ywarn-numeric-widen", - "-Ywarn-value-discard" - ) + val dottySettings = Seq( + crossScalaVersions += ScalaDotty, + scalacOptions ++= { + if (scalaVersion.value == ScalaDotty) + Seq("-noindent") + else + Seq() + }, + scalacOptions --= { + if (scalaVersion.value == ScalaDotty) + Seq("-Xfatal-warnings") + else + Seq() + }, + Compile / doc / sources := { + val old = (Compile / doc / sources).value + if (scalaVersion.value == ScalaDotty) { + Nil + } else { + old + } + }, + Test / parallelExecution := { + val old = (Test / parallelExecution).value + if (scalaVersion.value == ScalaDotty) { + false + } else { + old + } + } + ) - final private val Opts213 = - CommonOpts2x ++ Seq( - "-Wunused:imports", - "-Wvalue-discard", - "-Wunused:patvars", - "-Wunused:privates", - "-Wunused:params", - "-Wvalue-discard", - "-Wdead-code", - "-P:silencer:globalFilters=[import scala.collection.compat._]" - ) + val scalaReflectSettings = Seq( + libraryDependencies ++= Seq("dev.zio" %%% "izumi-reflect" % "1.0.0-M10") + ) - final private val OptsTo212 = - CommonOpts2x ++ Seq( - "-Xfuture", - "-Ypartial-unification", - "-Ywarn-nullary-override", - "-Yno-adapted-args", - "-Ywarn-infer-any", - "-Ywarn-inaccessible", - "-Ywarn-nullary-unit", - "-Ywarn-unused-import" - ) + // Keep this consistent with the version in .core-tests/shared/src/test/scala/REPLSpec.scala + val replSettings = makeReplSettings { + """|import zio._ + |import zio.console._ + |import zio.duration._ + |import zio.Runtime.default._ + |implicit class RunSyntax[A](io: ZIO[ZEnv, Any, A]){ def unsafeRun: A = Runtime.default.unsafeRun(io.provideLayer(ZEnv.live)) } + """.stripMargin + } - final private val OptsTo3 = + // Keep this consistent with the version in .streams-tests/shared/src/test/scala/StreamREPLSpec.scala + val streamReplSettings = makeReplSettings { + """|import zio._ + |import zio.console._ + |import zio.duration._ + |import zio.stream._ + |import zio.Runtime.default._ + |implicit class RunSyntax[A](io: ZIO[ZEnv, Any, A]){ def unsafeRun: A = Runtime.default.unsafeRun(io.provideLayer(ZEnv.live)) } + """.stripMargin + } + + def makeReplSettings(initialCommandsStr: String) = Seq( - "-noindent" + // In the repl most warnings are useless or worse. + // This is intentionally := as it's more direct to enumerate the few + // options we do want than to try to subtract off the ones we don't. + // One of -Ydelambdafy:inline or -Yrepl-class-based must be given to + // avoid deadlocking on parallel operations, see + // https://issues.scala-lang.org/browse/SI-9076 + Compile / console / scalacOptions := Seq( + "-Ypartial-unification", + "-language:higherKinds", + "-language:existentials", + "-Yno-adapted-args", + "-Xsource:2.13", + "-Yrepl-class-based" + ), + Compile / console / initialCommands := initialCommandsStr ) - private def extraOptions(scalaVersion: String) = + def extraOptions(scalaVersion: String, optimize: Boolean) = CrossVersion.partialVersion(scalaVersion) match { + case Some((3, 0)) => + Seq( + "-language:implicitConversions", + "-Xignore-scala2-macros" + ) case Some((2, 13)) => - Opts213 + Seq( + "-Ywarn-unused:params,-implicits" + ) ++ std2xOptions ++ optimizerOptions(optimize) case Some((2, 12)) => Seq( "-opt-warnings", "-Ywarn-extra-implicit", "-Ywarn-unused:_,imports", "-Ywarn-unused:imports", - "-opt:l:inline", - "-opt-inline-from:" - ) ++ OptsTo212 + "-Ypartial-unification", + "-Yno-adapted-args", + "-Ywarn-inaccessible", + "-Ywarn-infer-any", + "-Ywarn-nullary-override", + "-Ywarn-nullary-unit", + "-Ywarn-unused:params,-implicits", + "-Xfuture", + "-Xsource:2.13", + "-Xmax-classfile-name", + "242" + ) ++ std2xOptions ++ optimizerOptions(optimize) + case Some((2, 11)) => + Seq( + "-Ypartial-unification", + "-Yno-adapted-args", + "-Ywarn-inaccessible", + "-Ywarn-infer-any", + "-Ywarn-nullary-override", + "-Ywarn-nullary-unit", + "-Xexperimental", + "-Ywarn-unused-import", + "-Xfuture", + "-Xsource:2.13", + "-Xmax-classfile-name", + "242" + ) ++ std2xOptions + case _ => Seq.empty + } + + def platformSpecificSources(platform: String, conf: String, baseDirectory: File)(versions: String*) = + for { + platform <- List("shared", platform) + version <- "scala" :: versions.toList.map("scala-" + _) + result = baseDirectory.getParentFile / platform.toLowerCase / "src" / conf / version + if result.exists + } yield result + + def crossPlatformSources(scalaVer: String, platform: String, conf: String, baseDir: File) = { + val versions = CrossVersion.partialVersion(scalaVer) match { + case Some((2, 11)) => + List("2.11", "2.11+", "2.11-2.12", "2.x") + case Some((2, 12)) => + List("2.12", "2.11+", "2.12+", "2.11-2.12", "2.12-2.13", "2.x") + case Some((2, 13)) => + List("2.13", "2.11+", "2.12+", "2.13+", "2.12-2.13", "2.x") case Some((3, 0)) => - OptsTo3 + List("dotty", "2.11+", "2.12+", "2.13+", "3.x") case _ => - Seq("-Xexperimental") ++ OptsTo212 + List() + } + platformSpecificSources(platform, conf, baseDir)(versions: _*) + } + + lazy val crossProjectSettings = Seq( + Compile / unmanagedSourceDirectories ++= { + crossPlatformSources( + scalaVersion.value, + crossProjectPlatform.value.identifier, + "main", + baseDirectory.value + ) + }, + Test / unmanagedSourceDirectories ++= { + crossPlatformSources( + scalaVersion.value, + crossProjectPlatform.value.identifier, + "test", + baseDirectory.value + ) + } + ) + + def stdSettings(prjName: String) = + Seq( + name := s"$prjName", + crossScalaVersions := Seq(Scala211, Scala212, Scala213), + ThisBuild / scalaVersion := Scala213, + scalacOptions := stdOptions ++ extraOptions(scalaVersion.value, optimize = !isSnapshot.value), + libraryDependencies ++= { + if (scalaVersion.value == ScalaDotty) + Seq( + "com.github.ghik" % s"silencer-lib_$Scala213" % SilencerVersion % Provided + ) + else + Seq( + ("com.github.ghik" % "silencer-lib" % SilencerVersion % Provided).cross(CrossVersion.full), + compilerPlugin(("com.github.ghik" % "silencer-plugin" % SilencerVersion).cross(CrossVersion.full)), + compilerPlugin(("org.typelevel" %% "kind-projector" % "0.11.3").cross(CrossVersion.full)) + ) + }, + semanticdbEnabled := scalaVersion.value != ScalaDotty, // enable SemanticDB + semanticdbOptions += "-P:semanticdb:synthetics:on", + semanticdbVersion := scalafixSemanticdb.revision, // use Scalafix compatible version + ThisBuild / scalafixScalaBinaryVersion := CrossVersion.binaryScalaVersion(scalaVersion.value), + ThisBuild / scalafixDependencies ++= List( + "com.github.liancheng" %% "organize-imports" % "0.5.0", + "com.github.vovapolu" %% "scaluzzi" % "0.1.18" + ), + Test / parallelExecution := true, + incOptions ~= (_.withLogRecompileOnMacro(false)), + autoAPIMappings := true, + unusedCompileDependenciesFilter -= moduleFilter("org.scala-js", "scalajs-library") + ) + + def macroExpansionSettings = + Seq( + scalacOptions ++= { + CrossVersion.partialVersion(scalaVersion.value) match { + case Some((2, 13)) => Seq("-Ymacro-annotations") + case _ => Seq.empty + } + }, + libraryDependencies ++= { + CrossVersion.partialVersion(scalaVersion.value) match { + case Some((2, x)) if x <= 12 => + Seq(compilerPlugin(("org.scalamacros" % "paradise" % "2.1.1").cross(CrossVersion.full))) + case _ => Seq.empty + } + } + ) + + def macroDefinitionSettings = + Seq( + scalacOptions += "-language:experimental.macros", + libraryDependencies ++= { + if (scalaVersion.value == ScalaDotty) Seq() + else + Seq( + "org.scala-lang" % "scala-reflect" % scalaVersion.value % "provided", + "org.scala-lang" % "scala-compiler" % scalaVersion.value % "provided" + ) + } + ) + + def jsSettings = + Seq( + libraryDependencies += "io.github.cquiroz" %%% "scala-java-time" % "2.2.2", + libraryDependencies += "io.github.cquiroz" %%% "scala-java-time-tzdb" % "2.2.2" + ) + + def nativeSettings = + Seq( + Test / skip := true, + doc / skip := true, + Compile / doc / sources := Seq.empty + ) + + val scalaReflectTestSettings: List[Setting[_]] = List( + libraryDependencies ++= { + if (scalaVersion.value == ScalaDotty) + Seq("org.scala-lang" % "scala-reflect" % Scala213 % Test) + else + Seq("org.scala-lang" % "scala-reflect" % scalaVersion.value % Test) } + ) + + def welcomeMessage = + onLoadMessage := { + import scala.Console + + def header(text: String): String = s"${Console.RED}$text${Console.RESET}" + + def item(text: String): String = s"${Console.GREEN}> ${Console.CYAN}$text${Console.RESET}" + def subItem(text: String): String = s" ${Console.YELLOW}> ${Console.CYAN}$text${Console.RESET}" + + s"""|${header(" ________ ___")} + |${header("|__ /_ _/ _ \\")} + |${header(" / / | | | | |")} + |${header(" / /_ | | |_| |")} + |${header(s"/____|___\\___/ ${version.value}")} + | + |Useful sbt tasks: + |${item("build")} - Prepares sources, compiles and runs tests. + |${item("prepare")} - Prepares sources by applying both scalafix and scalafmt + |${item("fix")} - Fixes sources files using scalafix + |${item("fmt")} - Formats source files using scalafmt + |${item("~compileJVM")} - Compiles all JVM modules (file-watch enabled) + |${item("testJVM")} - Runs all JVM tests + |${item("testJS")} - Runs all ScalaJS tests + |${item("testOnly *.YourSpec -- -t \"YourLabel\"")} - Only runs tests with matching term e.g. + |${subItem("coreTestsJVM/testOnly *.ZIOSpec -- -t \"happy-path\"")} + |${item("docs/docusaurusCreateSite")} - Generates the ZIO microsite + """.stripMargin + } + + implicit class ModuleHelper(p: Project) { + def module: Project = p.in(file(p.id)).settings(stdSettings(p.id)) + } } diff --git a/project/build.properties b/project/build.properties index 7bb94aa9..1a1496c6 100644 --- a/project/build.properties +++ b/project/build.properties @@ -1 +1 @@ -sbt.version = 1.5.1 +sbt.version = 1.5.2 diff --git a/project/plugins.sbt b/project/plugins.sbt index bf1106f2..2e72624c 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -1,13 +1,19 @@ -addSbtPlugin("ch.epfl.scala" % "sbt-bloop" % "1.4.8") -addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.2") -addSbtPlugin("org.scalameta" % "sbt-mdoc" % "2.2.20") -addSbtPlugin("com.github.cb372" % "sbt-explicit-dependencies" % "0.2.16") -addSbtPlugin("com.geirsson" % "sbt-ci-release" % "1.5.7") -addSbtPlugin("ch.epfl.lamp" % "sbt-dotty" % "0.5.5") +addSbtPlugin("ch.epfl.scala" % "sbt-bloop" % "1.4.8") +addSbtPlugin("ch.epfl.scala" % "sbt-scalafix" % "0.9.27") +addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.10.0") +addSbtPlugin("com.eed3si9n" % "sbt-unidoc" % "0.4.3") +addSbtPlugin("com.geirsson" % "sbt-ci-release" % "1.5.7") +addSbtPlugin("com.github.cb372" % "sbt-explicit-dependencies" % "0.2.15") +addSbtPlugin("com.thoughtworks.sbt-api-mappings" % "sbt-api-mappings" % "3.0.0") +addSbtPlugin("com.typesafe" % "sbt-mima-plugin" % "0.9.0") +addSbtPlugin("de.heikoseeberger" % "sbt-header" % "5.6.0") +addSbtPlugin("org.portable-scala" % "sbt-scala-native-crossproject" % "1.0.0") +addSbtPlugin("org.portable-scala" % "sbt-scalajs-crossproject" % "1.0.0") +addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.5.1") +addSbtPlugin("org.scala-native" % "sbt-scala-native" % "0.4.0") +addSbtPlugin("org.scalameta" % "sbt-mdoc" % "2.2.20") +addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.2") +addSbtPlugin("pl.project13.scala" % "sbt-jcstress" % "0.2.0") +addSbtPlugin("pl.project13.scala" % "sbt-jmh" % "0.4.0") -// Scala-js support -addSbtPlugin("org.portable-scala" % "sbt-scalajs-crossproject" % "1.0.0") -addSbtPlugin("org.scala-js" % "sbt-scalajs" % "1.5.1") - -// Benchmark -addSbtPlugin("pl.project13.scala" % "sbt-jmh" % "0.4.0") +libraryDependencies += "org.snakeyaml" % "snakeyaml-engine" % "2.3" diff --git a/sbt b/sbt index 11a73fbc..1aac2d3f 100755 --- a/sbt +++ b/sbt @@ -34,11 +34,11 @@ set -o pipefail -declare -r sbt_release_version="1.3.13" -declare -r sbt_unreleased_version="1.4.0-M1" +declare -r sbt_release_version="1.5.1" +declare -r sbt_unreleased_version="1.5.1" -declare -r latest_213="2.13.3" -declare -r latest_212="2.12.12" +declare -r latest_213="2.13.5" +declare -r latest_212="2.12.13" declare -r latest_211="2.11.12" declare -r latest_210="2.10.7" declare -r latest_29="2.9.3" @@ -48,7 +48,7 @@ declare -r buildProps="project/build.properties" declare -r sbt_launch_ivy_release_repo="https://repo.typesafe.com/typesafe/ivy-releases" declare -r sbt_launch_ivy_snapshot_repo="https://repo.scala-sbt.org/scalasbt/ivy-snapshots" -declare -r sbt_launch_mvn_release_repo="https://repo.scala-sbt.org/scalasbt/maven-releases" +declare -r sbt_launch_mvn_release_repo="https://repo1.maven.org/maven2" declare -r sbt_launch_mvn_snapshot_repo="https://repo.scala-sbt.org/scalasbt/maven-snapshots" declare -r default_jvm_opts_common="-Xms512m -Xss2m -XX:MaxInlineLevel=18" @@ -247,11 +247,18 @@ java_version() { echo "$version" } +is_apple_silicon() { [[ "$(uname -s)" == "Darwin" && "$(uname -m)" == "arm64" ]]; } + # MaxPermSize critical on pre-8 JVMs but incurs noisy warning on 8+ default_jvm_opts() { local -r v="$(java_version)" if [[ $v -ge 10 ]]; then - echo "$default_jvm_opts_common -XX:+UnlockExperimentalVMOptions -XX:+UseJVMCICompiler" + if is_apple_silicon; then + # As of Dec 2020, JVM for Apple Silicon (M1) doesn't support JVMCI + echo "$default_jvm_opts_common" + else + echo "$default_jvm_opts_common -XX:+UnlockExperimentalVMOptions -XX:+UseJVMCICompiler" + fi elif [[ $v -ge 8 ]]; then echo "$default_jvm_opts_common" else @@ -471,7 +478,7 @@ process_args() { -trace) require_arg integer "$1" "$2" && trace_level="$2" && shift 2 ;; -debug-inc) addJava "-Dxsbt.inc.debug=true" && shift ;; - -no-colors) addJava "-Dsbt.log.noformat=true" && shift ;; + -no-colors) addJava "-Dsbt.log.noformat=true" && addJava "-Dsbt.color=false" && shift ;; -sbt-create) sbt_create=true && shift ;; -sbt-dir) require_arg path "$1" "$2" && sbt_dir="$2" && shift 2 ;; -sbt-boot) require_arg path "$1" "$2" && addJava "-Dsbt.boot.directory=$2" && shift 2 ;; diff --git a/slf4j-bridge/src/main/scala-2/org/slf4j/impl/ZioLogger.scala b/slf4j-bridge/src/main/scala-2/org/slf4j/impl/ZioLogger.scala index 629543ec..26d8a304 100644 --- a/slf4j-bridge/src/main/scala-2/org/slf4j/impl/ZioLogger.scala +++ b/slf4j-bridge/src/main/scala-2/org/slf4j/impl/ZioLogger.scala @@ -2,7 +2,7 @@ package org.slf4j.impl import org.slf4j.helpers.MarkerIgnoringBase import zio.ZIO -import zio.logging.{ log, LogAnnotation, Logging } +import zio.logging.{ LogAnnotation, Logging, log } class ZioLogger(name: String, factory: ZioLoggerFactory) extends MarkerIgnoringBase { private val nameList = name.split('.').toList diff --git a/slf4j-bridge/src/main/scala/zio/logging/slf4j/bridge/package.scala b/slf4j-bridge/src/main/scala/zio/logging/slf4j/bridge/package.scala index e2f5d7ee..d326865e 100644 --- a/slf4j-bridge/src/main/scala/zio/logging/slf4j/bridge/package.scala +++ b/slf4j-bridge/src/main/scala/zio/logging/slf4j/bridge/package.scala @@ -1,8 +1,8 @@ package zio.logging.slf4j import org.slf4j.impl.ZioLoggerFactory -import zio.{ ZIO, ZLayer } import zio.logging.Logging +import zio.{ ZIO, ZLayer } package object bridge { def initializeSlf4jBridge[R <: Logging]: ZLayer[R, Nothing, R] = diff --git a/slf4j-bridge/src/test/scala/zio/logging/slf4j/bridge/Slf4jBridgeSpec.scala b/slf4j-bridge/src/test/scala/zio/logging/slf4j/bridge/Slf4jBridgeSpec.scala index b88dd19b..9cfe561b 100644 --- a/slf4j-bridge/src/test/scala/zio/logging/slf4j/bridge/Slf4jBridgeSpec.scala +++ b/slf4j-bridge/src/test/scala/zio/logging/slf4j/bridge/Slf4jBridgeSpec.scala @@ -5,9 +5,10 @@ import zio.logging.LoggerSpec.TestLogger import zio.logging.{ LogAnnotation, LogContext, LogLevel } import zio.test.Assertion._ import zio.test._ +import zio.test.environment.TestEnvironment object Slf4jBridgeSpec extends DefaultRunnableSpec { - override def spec = + override def spec: Spec[TestEnvironment, TestFailure[Throwable], TestSuccess] = suite("Slf4jBridge")( testM("logs through slf4j") { for { diff --git a/slf4j/src/main/scala/zio/logging/slf4j/Slf4jLogger.scala b/slf4j/src/main/scala/zio/logging/slf4j/Slf4jLogger.scala index e44859d2..cf594bfa 100644 --- a/slf4j/src/main/scala/zio/logging/slf4j/Slf4jLogger.scala +++ b/slf4j/src/main/scala/zio/logging/slf4j/Slf4jLogger.scala @@ -25,7 +25,7 @@ object Slf4jLogger { val loggerName = context(LogAnnotation.Name) logger(loggerName).map { slf4jLogger => val maybeThrowable = context.get(LogAnnotation.Throwable).orNull - context.get(LogAnnotation.Level).level match { + (context.get(LogAnnotation.Level).level: @unchecked) match { case LogLevel.Off.level => () case LogLevel.Debug.level => if (slf4jLogger.isDebugEnabled) slf4jLogger.debug(line, maybeThrowable) case LogLevel.Trace.level => if (slf4jLogger.isTraceEnabled) slf4jLogger.trace(line, maybeThrowable) @@ -83,14 +83,16 @@ object Slf4jLogger { val mdc: Map[String, String] = filter(context.renderContext) val previous = Option(MDC.getCopyOfContextMap()).getOrElse(Map.empty[String, String].asJava) MDC.setContextMap(mdc.asJava) - try context.get(LogAnnotation.Level).level match { - case LogLevel.Off.level => () - case LogLevel.Debug.level => slf4jLogger.debug(line, maybeThrowable) - case LogLevel.Trace.level => slf4jLogger.trace(line, maybeThrowable) - case LogLevel.Info.level => slf4jLogger.info(line, maybeThrowable) - case LogLevel.Warn.level => slf4jLogger.warn(line, maybeThrowable) - case LogLevel.Error.level => slf4jLogger.error(line, maybeThrowable) - case LogLevel.Fatal.level => slf4jLogger.error(line, maybeThrowable) + try { + (context.get(LogAnnotation.Level).level: @unchecked) match { + case LogLevel.Off.level => () + case LogLevel.Debug.level => slf4jLogger.debug(line, maybeThrowable) + case LogLevel.Trace.level => slf4jLogger.trace(line, maybeThrowable) + case LogLevel.Info.level => slf4jLogger.info(line, maybeThrowable) + case LogLevel.Warn.level => slf4jLogger.warn(line, maybeThrowable) + case LogLevel.Error.level => slf4jLogger.error(line, maybeThrowable) + case LogLevel.Fatal.level => slf4jLogger.error(line, maybeThrowable) + } } finally MDC.setContextMap(previous) } } diff --git a/slf4j/src/test/scala/zio/logging/slf4j/Slf4jLoggerTest.scala b/slf4j/src/test/scala/zio/logging/slf4j/Slf4jLoggerTest.scala index d66d614c..7d98b0d8 100644 --- a/slf4j/src/test/scala/zio/logging/slf4j/Slf4jLoggerTest.scala +++ b/slf4j/src/test/scala/zio/logging/slf4j/Slf4jLoggerTest.scala @@ -1,19 +1,18 @@ package zio.logging.slf4j -import java.util.UUID - -import zio.{ UIO, ULayer } -import zio.test.DefaultRunnableSpec import zio.logging._ -import zio.test._ import zio.test.Assertion._ import zio.test.TestAspect.{ exceptDotty, sequential } +import zio.test.environment.TestEnvironment +import zio.test.{ DefaultRunnableSpec, _ } +import zio.{ UIO, ULayer } +import java.util.UUID import scala.jdk.CollectionConverters._ object Slf4jLoggerTest extends DefaultRunnableSpec { - val uuid1 = UUID.randomUUID() + val uuid1: UUID = UUID.randomUUID() val logLayerOptIn: ULayer[Logging] = Slf4jLogger.makeWithAnnotationsAsMdc( mdcAnnotations = List(LogAnnotation.CorrelationId, LogAnnotation.Level) @@ -23,7 +22,7 @@ object Slf4jLoggerTest extends DefaultRunnableSpec { Slf4jLogger.makeWithAllAnnotationsAsMdc(Set(LogAnnotation.Level.name)) >>> Logging.withContext(LogContext.empty.annotate(LogAnnotation.CorrelationId, Some(uuid1))) - def spec = + def spec: ZSpec[TestEnvironment, Any] = suite("slf4j logger")( testM("logger name from stack trace") { for { diff --git a/slf4j/src/test/scala/zio/logging/slf4j/TestAppender.scala b/slf4j/src/test/scala/zio/logging/slf4j/TestAppender.scala index bc02cd74..6728998a 100644 --- a/slf4j/src/test/scala/zio/logging/slf4j/TestAppender.scala +++ b/slf4j/src/test/scala/zio/logging/slf4j/TestAppender.scala @@ -1,10 +1,9 @@ package zio.logging.slf4j -import java.util.concurrent.atomic.AtomicReference - import ch.qos.logback.classic.spi.ILoggingEvent import ch.qos.logback.core.AppenderBase +import java.util.concurrent.atomic.AtomicReference import scala.annotation.tailrec class TestAppender extends AppenderBase[ILoggingEvent] { diff --git a/website/core/Footer.js b/website/core/Footer.js index 73cac642..b039cf0e 100755 --- a/website/core/Footer.js +++ b/website/core/Footer.js @@ -54,6 +54,17 @@ class Footer extends React.Component { discord +
+
Additional resources
+ + ZIO Homepage + + + Scaladoc + +
{this.props.config.copyright}
diff --git a/website/siteConfig.js b/website/siteConfig.js index da850350..ae5dfab3 100644 --- a/website/siteConfig.js +++ b/website/siteConfig.js @@ -32,9 +32,13 @@ const siteConfig = { // For no header links in the top nav bar -> headerLinks: [], headerLinks: [ - {doc: 'overview/overview_index', label: 'Overview'} + {doc: 'overview/overview_index', label: 'Overview'}, + {href: 'api', label: 'API'}, ], + // by default Docusaurus combines CSS files in a way that doesn't play nicely with Scaladoc + separateCss: ["api"], + // If you have users set above, you add it here: users, @@ -79,6 +83,8 @@ const siteConfig = { scrollToTopOptions: { cornerOffset: 100, }, + + customDocsPath: 'zio-logging-docs/target/mdoc', }; module.exports = siteConfig;