Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add and apply .scalafmt.conf #212

Merged
merged 1 commit into from
Aug 15, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions .scalafmt.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
version = "3.7.1"

runner.dialect = scala213source3

maxColumn = 120
preset = IntelliJ

align {
preset = most
allowOverflow = false
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ import com.google.cloud.logging.{Option => _, _}
import io.circe.{Json, JsonNumber, JsonObject}
import org.slf4j.Marker


object CloudJsonLoggingAppender {
private def severityFor(level: Level) =
level match {
Expand All @@ -32,53 +31,52 @@ object CloudJsonLoggingAppender {
private def someMap[A, B](entries: (A, Option[B])*): Map[A, B] =
entries.collect { case (k, Some(v)) => (k, v) }.toMap

private def stack(nullOrThrowProxy: IThrowableProxy,
refs: mutable.Set[IThrowableProxy]): Option[util.Map[String, AnyRef]] =
private def stack(
nullOrThrowProxy: IThrowableProxy,
refs: mutable.Set[IThrowableProxy]
): Option[util.Map[String, AnyRef]] =
Option(nullOrThrowProxy).map { throwProxy =>
if (refs.contains(throwProxy))
someMap("circularRef" -> Some(throwProxy.toString: AnyRef)).asJava
else {
refs += throwProxy
someMap(
"className" -> Some(throwProxy.getClassName),
"message" -> Some(throwProxy.getMessage),
"stack" -> Option(throwProxy.getStackTraceElementProxyArray)
"className" -> Some(throwProxy.getClassName),
"message" -> Some(throwProxy.getMessage),
"stack" -> Option(throwProxy.getStackTraceElementProxyArray)
.map(_.map(_.getStackTraceElement.toString)),
"suppressed" -> Some(throwProxy.getSuppressed.map(stack(_, refs)))
.filter(_.nonEmpty),
"cause" -> stack(throwProxy.getCause, refs)
"cause" -> stack(throwProxy.getCause, refs)
).asJava
}
}

private object JsonToRaw extends Json.Folder[Any] {
override def onNull: Null = null
override def onBoolean(value: Boolean): Boolean = value
override def onNumber(value: JsonNumber): Double = value.toDouble
override def onString(value: String): String = value
override def onNull: Null = null
override def onBoolean(value: Boolean) : Boolean = value
override def onNumber(value: JsonNumber) : Double = value.toDouble
override def onString(value: String) : String = value
override def onArray(value: Vector[Json]): util.List[Any] =
value.map(_.foldWith[Any](JsonToRaw)).asJava
override def onObject(value: JsonObject): util.Map[String, Any] =
override def onObject(value: JsonObject) : util.Map[String, Any] =
value.toMap.map { case (k, v) => (k, v.foldWith[Any](JsonToRaw)) }.asJava
}

def marker: Marker => Any = {
case JsonMarker(_name, data, references@_*) =>
case JsonMarker(_name, data, references @ _*) =>
Map(
"name" -> _name,
"data" -> data.foldWith[Any](JsonToRaw),
"name" -> _name,
"data" -> data.foldWith[Any](JsonToRaw),
"references" -> references.map(marker).toArray
).asJava
case m if m.hasReferences =>
Map(
"name" -> m.getName,
"references" -> m.iterator.asScala.map(marker).toArray
).asJava
case m =>
case m if m.hasReferences =>
Map("name" -> m.getName, "references" -> m.iterator.asScala.map(marker).toArray).asJava
case m =>
m.getName
}

private val legalNameChars =
private val legalNameChars =
('a' to 'z').toSet ++ ('A' to 'Z') ++ ('0' to '9') ++ Set('/', '_', '-', '.')
private def legalizeNameChar(c: Char) = if (legalNameChars(c)) c else '-'

Expand All @@ -103,33 +101,33 @@ object CloudJsonLoggingAppender {
new util.IdentityHashMap[IThrowableProxy, Throwable].asScala

def toThrowable(proxy: IThrowableProxy): Throwable =
refs.getOrElseUpdate(proxy, {
val res =
new Throwable(proxy.getMessage, toThrowable(proxy.getCause))
proxy.getSuppressed.foreach(
s => res.addSuppressed(toThrowable(s))
)
res
})
refs.getOrElseUpdate(
proxy, {
val res =
new Throwable(proxy.getMessage, toThrowable(proxy.getCause))
proxy.getSuppressed.foreach(s => res.addSuppressed(toThrowable(s)))
res
}
)

render(toThrowable(iThrowableProxy))
}
}

val payload =
someMap(
"message" -> Some(message),
"marker" -> Option(e.getMarker).map(marker),
"message" -> Some(message),
"marker" -> Option(e.getMarker).map(marker),
"throwable" -> stack(
e.getThrowableProxy,
Collections
.newSetFromMap[IThrowableProxy](new util.IdentityHashMap)
.asScala
)
)
val labels =
val labels =
Map(
"levelName" -> level.toString,
"levelName" -> level.toString,
"levelValue" -> String.valueOf(level.toInt),
"threadName" -> e.getThreadName
) ++
Expand All @@ -147,11 +145,8 @@ object CloudJsonLoggingAppender {
}

class CloudJsonLoggingAppender extends LoggingAppender {
private lazy val logging = LoggingOptions.getDefaultInstance.getService
private lazy val resource = MonitoredResourceUtil.getResource(
LoggingOptions.getDefaultInstance.getProjectId,
null
)
private lazy val logging = LoggingOptions.getDefaultInstance.getService
private lazy val resource = MonitoredResourceUtil.getResource(LoggingOptions.getDefaultInstance.getProjectId, null)
private lazy val defaultWriteOptions =
Seq(WriteOption.logName("java.log"), WriteOption.resource(resource))

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,29 +14,28 @@ import org.scalatest.Inside._
import org.scalatest.funsuite.AnyFunSuite
import org.slf4j.Marker


class CloudJsonLoggingAppenderTests extends AnyFunSuite {
test("Exception") {
val loggingEvent: ILoggingEvent = new ILoggingEvent {
override val getThreadName: String = Thread.currentThread().getName
override def getLevel: Level = Level.ERROR
override def getMessage: String = "This is a test message"
override def getArgumentArray: Array[AnyRef] = Array.empty
override def getFormattedMessage: String = getMessage
override def getLoggerName: String = getClass.getName
override def getLoggerContextVO: LoggerContextVO =
override val getThreadName: String = Thread.currentThread().getName
override def getLevel: Level = Level.ERROR
override def getMessage: String = "This is a test message"
override def getArgumentArray: Array[AnyRef] = Array.empty
override def getFormattedMessage: String = getMessage
override def getLoggerName: String = getClass.getName
override def getLoggerContextVO: LoggerContextVO =
new LoggerContextVO(new LoggerContext)
override def getThrowableProxy: IThrowableProxy =
override def getThrowableProxy: IThrowableProxy =
new ThrowableProxy(new RuntimeException("Some error"))
override def getCallerData: Array[StackTraceElement] = Array.empty
override def hasCallerData: Boolean = false
override def getMarker: Marker =
override def getCallerData: Array[StackTraceElement] = Array.empty
override def hasCallerData: Boolean = false
override def getMarker: Marker =
JsonMarker("testMarker", Json.obj("key" -> Json.fromString("value")))
override def getMDCPropertyMap: util.Map[String, String] =
Map.empty[String, String].asJava
override def getMdc: util.Map[String, String] = getMDCPropertyMap
override val getTimeStamp: Long = System.currentTimeMillis()
override def prepareForDeferredProcessing(): Unit = ()
override def getMdc: util.Map[String, String] = getMDCPropertyMap
override val getTimeStamp: Long = System.currentTimeMillis()
override def prepareForDeferredProcessing(): Unit = ()
}

val logEntry = CloudJsonLoggingAppender.logEntryFor(loggingEvent)
Expand All @@ -46,20 +45,17 @@ class CloudJsonLoggingAppenderTests extends AnyFunSuite {
val data: util.Map[String, AnyRef] =
logEntry.getPayload[Payload.JsonPayload].getDataAsMap

inside(data.get("message")) {
case message: String =>
assert(message.startsWith(loggingEvent.getMessage))
inside(data.get("message")) { case message: String =>
assert(message.startsWith(loggingEvent.getMessage))
}

inside(data.get("marker")) {
case marker: util.Map[_, _] =>
assert(marker.get("name") == "testMarker")
inside(data.get("marker")) { case marker: util.Map[_, _] =>
assert(marker.get("name") == "testMarker")
}

inside(data.get("throwable")) {
case throwable: util.Map[_, _] =>
assert(throwable.get("message") == "Some error")
assert(throwable.containsKey("stack"))
inside(data.get("throwable")) { case throwable: util.Map[_, _] =>
assert(throwable.get("message") == "Some error")
assert(throwable.containsKey("stack"))
}
}
}
7 changes: 3 additions & 4 deletions build.sbt
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
import _root_.io.github.nafg.mergify.dsl.*


ThisBuild / crossScalaVersions := Seq("2.13.11", "3.3.0")
ThisBuild / scalaVersion := (ThisBuild / crossScalaVersions).value.last
ThisBuild / scalaVersion := (ThisBuild / crossScalaVersions).value.last

ThisBuild / organization := "io.github.nafg.cloudlogging"

Expand All @@ -18,7 +17,7 @@ lazy val marker =
.settings(
noFatalWarnings,
libraryDependencies += "io.circe" %% "circe-core" % "0.14.5",
libraryDependencies += "org.slf4j" % "slf4j-api" % "2.0.7"
libraryDependencies += "org.slf4j" % "slf4j-api" % "2.0.7"
)

lazy val appender =
Expand All @@ -27,7 +26,7 @@ lazy val appender =
.settings(
noFatalWarnings,
libraryDependencies += "com.google.cloud" % "google-cloud-logging-logback" % "0.130.21-alpha",
libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.16" % Test
libraryDependencies += "org.scalatest" %% "scalatest" % "3.2.16" % Test
)

publish / skip := true
40 changes: 21 additions & 19 deletions ci.sbt
Original file line number Diff line number Diff line change
@@ -1,24 +1,26 @@
inThisBuild(List(
homepage := Some(url("https://github.com/nafg/cloud-logging-logback-scala")),
licenses := List("Apache-2.0" -> url("https://www.apache.org/licenses/LICENSE-2.0")),
developers := List(
Developer("nafg", "Naftoli Gugenheim", "98384+nafg@users.noreply.github.com", url("https://github.com/nafg"))
),
dynverGitDescribeOutput ~= (_.map(o => o.copy(dirtySuffix = sbtdynver.GitDirtySuffix("")))),
dynverSonatypeSnapshots := true,
githubWorkflowTargetTags ++= Seq("v*"),
githubWorkflowPublishTargetBranches := Seq(RefPredicate.StartsWith(Ref.Tag("v"))),
githubWorkflowPublish := Seq(
WorkflowStep.Sbt(
List("ci-release"),
env = Map(
"PGP_PASSPHRASE" -> "${{ secrets.PGP_PASSPHRASE }}",
"PGP_SECRET" -> "${{ secrets.PGP_SECRET }}",
"SONATYPE_PASSWORD" -> "${{ secrets.SONATYPE_PASSWORD }}",
"SONATYPE_USERNAME" -> "${{ secrets.SONATYPE_USERNAME }}"
inThisBuild(
List(
homepage := Some(url("https://github.com/nafg/cloud-logging-logback-scala")),
licenses := List("Apache-2.0" -> url("https://www.apache.org/licenses/LICENSE-2.0")),
developers := List(
Developer("nafg", "Naftoli Gugenheim", "98384+nafg@users.noreply.github.com", url("https://github.com/nafg"))
),
dynverGitDescribeOutput ~= (_.map(o => o.copy(dirtySuffix = sbtdynver.GitDirtySuffix("")))),
dynverSonatypeSnapshots := true,
githubWorkflowTargetTags ++= Seq("v*"),
githubWorkflowPublishTargetBranches := Seq(RefPredicate.StartsWith(Ref.Tag("v"))),
githubWorkflowPublish := Seq(
WorkflowStep.Sbt(
List("ci-release"),
env = Map(
"PGP_PASSPHRASE" -> "${{ secrets.PGP_PASSPHRASE }}",
"PGP_SECRET" -> "${{ secrets.PGP_SECRET }}",
"SONATYPE_PASSWORD" -> "${{ secrets.SONATYPE_PASSWORD }}",
"SONATYPE_USERNAME" -> "${{ secrets.SONATYPE_USERNAME }}"
)
)
)
)
))
)

sonatypeProfileName := "io.github.nafg"
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,8 @@ package io.github.nafg.cloudlogging.marker
import io.circe.{Encoder, Json}
import org.slf4j.Marker

case class JsonMarker(name: String, data: Json, references: Marker*)
extends BasicMarker(name, references)
case class JsonMarker(name: String, data: Json, references: Marker*) extends BasicMarker(name, references)
object JsonMarker {
def apply[A: Encoder](name: String,
references: Marker*)(data: A): JsonMarker =
def apply[A: Encoder](name: String, references: Marker*)(data: A): JsonMarker =
JsonMarker(name, Encoder[A].apply(data), references: _*)
}
4 changes: 2 additions & 2 deletions project/plugins.sbt
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
addSbtPlugin("org.typelevel" % "sbt-tpolecat" % "0.5.0")
addSbtPlugin("com.github.sbt" % "sbt-ci-release" % "1.5.12")
addSbtPlugin("org.typelevel" % "sbt-tpolecat" % "0.5.0")
addSbtPlugin("com.github.sbt" % "sbt-ci-release" % "1.5.12")
addSbtPlugin("io.github.nafg.mergify" % "sbt-mergify-github-actions" % "0.7.0")