diff --git a/.gitignore b/.gitignore index aa7d96b..7e1ff03 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +project/secret # Created by https://www.gitignore.io/api/scala,java,python,sbt,emacs,linux,vim diff --git a/.travis.yml b/.travis.yml index 94115bb..745ada1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,20 +5,20 @@ scala: 2.12.7 jdk: openjdk8 before_install: -#- "[ -z \"${encrypted_ea952d6556a2_iv}\" ] || openssl aes-256-cbc -K $encrypted_ea952d6556a2_key -iv $encrypted_ea952d6556a2_iv -in ./project/zecret -out ./project/secret -d" +- "[ -z \"${encrypted_44858260af60_iv}\" ] || openssl aes-256-cbc -K $encrypted_44858260af60_key -iv $encrypted_44858260af60_iv -in ./project/zecret -out ./project/secret -d" - git fetch --tags -#env: -# global: -# - secure: H4UFodiAIzCT3FUAMxXgVwMM51mZVPKn6R0YzMsEQsSGRoEuwUlS3vnAX9b1MdiwHz4Y/THieOIEQ0UOegIE8qFU2Jb2Qy1rGvDE3fbcE1CwtR8XET1V9TjdqeaFRaD9oaeV21ur+842Mnz1GDkbAPe2Ah2gMWs1o5Jh0rv1Ip/IcIPV9I5S4m9oF1+xsKellKYFLjnym++nC8jOImWEIEtu+fwUuL9pScPlUaOPCMqja9oGG5fV4faLbXPhC6aJ75Kc8LbpruNyAbfW4WXreL1yTPK3pw+jl5nW3EmitvwQcCSPpgt8kiVHe+4pgyukbOIBi4+3YuPmYHB8vhQnaiiH227kVDBO3EY8Jh+ChhJSXHYR5rfxYWYFAG4n1ueyeLbs6JIbN55n/iabPXQhC8c38qqBBdlx02vdl13TDEANcgVSZ002sPJoOXUHcNPiPvdK69cmfUXa2km2O05nTvgtsN9kobGLud5BiTrz2iWF9XEoViMkDxrtBkhbio+IpBvcShE921HFtV0TvGRMFfrvgrkU/kCmfsfRk69Ba/xa3rrDy8g1v/NJmPpwZsUdrhD9GdY2cRUiDk16brcEdnwOng3HhM0ckiBg7IRhM+CKyTgKNtv2+RE8o0i0oKBnw/dT6hPk4YGSfGwFYGoocPuXD0UF42k7TbLSwudsCkI= -# - secure: ocjY7ezII9e4CVRSu7O1Y1QVijxHwefz57CwDIR9cvLWK+W1C92+erkzrAxfx6838cw4O6CVECnLfL4T03g/yFbGIpwykzRSHp/AhrguWCFUByl58wuiJdVY+uinHRfrADsYDhJVe2hcok3nB4UxQXhWGGoM0HhCXKOxys3cEzJH4uziudky89k9LIxIKfUWvPQxzagoNHmOfHiWoRF6pvIZva1FF5+LMq+pNme86PxlnA7wU0Qo5VjNCAqD6z04Hc9VdQWiOYplvvwutZDNfqi7VEXMTjcPgtJS3/nr4iwODr41aX7DdKDHUBxejouVxK2W1HITFI4ynQ79mstRhtEoPl4Zqsxj4Yr2+9ujDJhNkHhnapi8jaYW0gzDbHQtEkeZtDXkNvbQUgbOLwGId3TRNxzLwkBdZbuiXr84U/4MxuGRppNxGMDwacVRvHm8p7ZpxjVX8UV2mHsKI24lakPyQ1gRkOk+Vg7Av61uSDFYfG7Fd8hfiU1zdoYZS36MlfHzoGM6G0bXL6tXkN4yxgGOE1iMH0RVo69GxECpy0rndrFPJizzO071e0Vw2IHhiBNLb2tCH+jmIs+lmAqSgumIi+K2ZdwiVZGh1LkEV0qCIuDWLlj/98loj1vMu0+xea5VjGFGD3K/Q33AlUnpI6Kt2CmeZhGATqt/bdFz1LE= -# - secure: NqQdnBLufdQNRKI4fc+p426ZXZw3AljFBikYsqgWC+h5Vf/EAJhotr+yHCYDpqqzXBdNH/aXmXiSdXq4Ao13q9kKS4tJI8UlLuJVPKB466/+pSqHf15DWyn2RVafuq71heX4dlqiNalNjgAmVYRryBZI43PrBCesBjO4jgVI6DrzK6HZoxWcn1y+zKqOlAtCP7YKAYWcAgVdpS3Djyt0lyz9Olduug+CQmtQlTUh81dsLvzi/5Pr8YviJq5k91smR8pi/yvOPx+wwhXQwDhcHBI3BtOuXUYimEiPCWAXimslITCgU9PU6Tdu/L+fObismJjRBqjJgrmwmzo0w9Hm+WqLfzK5VAYWRfe8py8KTzRyj5l5+Ot/0tmLhZHiEfa2VgDGneZEdBJtglqvbCkblYej4YTdYVaCJLSeTCpW5QxQRJ8NPVJ8fi98E9nrHg5D5ZuCDc/KJaaHwqLXOqr2bH+scVnGBUtszGEBf+5uURrRUH5TIL4V9mzdutk4kSR3tTKG9/Z1l1eH4RFdeJEyX747wFmypvZJRj235zRKhkVKemaa2jas7MU8KX2kXTHbq1F/MGzB3A8S5qJ2uIM9GQz0Vkl+XshEaAiUw22JvAMdNYjJAS9ET4kgWfBLPKxGwuRh/ERXySNQjSl4AlVo3Bsz1mD6EwDs5meNBnpMrq4= +env: + global: + secure: "bmkXi1oBjcu6hvewAQuxVAyqYVp/S1JpKAWmvyUVq4Ufu24DGlZXkKpxHdEVasM4j9ztANd7o/0wlO0WLKgRQMrEfc+Zv7mVs24LCDFCINhGjNKjFNir+NmwnBboCbw8Lo5vkd22Jp9LNLykCM83ytCz68EHvBEuTIGrk+v9aSO4ff2sJ4ZYpzcPN2xptXz0hVGFPPvE+5yIogRtMgDVi7Vs8iHmaOP1+MP4IVH5Tsm+nUB9q48ZFBYj80dmecPBIFlIiNXRbWwUYIypqJP9Q6NJ4Dgshm1qCDJvJOtCiah84NIYKs7XZJmI6ufztXOivXJcKBPGs+gAiQ3q6fNcfPjS8V1yizx147UlqeyCBdXWLbZLuCTMwhBe03Ad1VzKdS6CY1ysWe6C5ZYJpPCw9Jhw9MO1huQWQRfiig7A8ZR4WEZ5xjRYgwjyJ13UPe+jI7AzA40H50wFh+EFdX62Et7sLoVu/+pf4vCfo1SGo/VdmZWTev0CcfUZH7w0WAvxBn/9iI3EkYcPdjQMurY2dXWdyfCMyCdodDEMrpzLkalFwU1lCyv2FG8IjVC+cYtD7MAhz3QTJUsEwtA6DUYxkTz3n9gontr8aXwGayOHnhq7Nywg06eCuAKEfSeAthpfjpv32YChZ1zkbkRAOt4GewkSd4WDPHOrYsDMfDpkHZI=" + secure: "mN1NrKrfhMoXLM0mEGUiTrZD/UVZ9YDgsuzb8Un58qeYIA5jvSYtiuy7YtmAtMX1OCyLgm7bMh4h+JBSZf4K3YjgDqynSSCAHciL04W6gBCrtdVWRxEMCcv639+yRJx6As/1y8RPZfwLyJunaa5Xj0abOUj/xNN7MDxzLroCIDM/ILAqpyVdGkqMNKOo/WMZJINxulssHNFr8icOL4+JeYTrW6cVtp0Wn8HIm5GOchY08T4SKVRVyAyCs+7QH0Syqy0C0dgYDB2eUjYQoF1krtAGeQqJ+zOrW5fBUkCljtwOTKEu1wJcy5uaIgS3AycJEgFOOPIbdN7M6KzOuA5iREMzSV5D7QzJ8LGbH4H3Vr7ZpK1Fm0kbqOb/AEAFfsAaZHnyroAJpIh8tUOBs7J3lFzrwLk1ZH+BpLu3AJ0zootkT+RTRc62Ylpil4btMSSItjZYVt5DWryHBm21XFy3cba32ZY4Bb3rBr+2qf4rIKPOueAxqWwPo+WmCZ84BjDnP+JyAGa1yZnqK/lUyu29XmTCd31l/xDyC9sPQQgvXtfHe+lxvne2dSfmhs6vaNKD+iyJcnF58je2Ilaer5Em3lZ4Z272R7sr11jcgxwhfjivDji3rGCcySfClA0btgpuLXWKJPGfrwcNAZy4YkfaRvQuF/KLETdGir0cszlgjAw=" + secure: "rpX9L6CKekBhmLWcq1ixRKvKkig92C3FDPtThYoM5kp5UqeTp0fNt3danLVODA8ABzbg7CEODgxymUOtcuDafWdOiV3wfSt1EBkA2i0CUzB/CBBpbFewQlTHnuB5+UrIUOKZ/4QyKuMiZeiaFfvA64Oqyxb3qN5QbJDpSYA5R5Zu7v8r+plVr4vXASdjqgkkYo3igkQWCMOJh11V3tTaDbtO2RHLsOWtUeqJh0s4W6HpGVCbqBYL10Ik4By/s7CPKT+mujdxs2UH09FoBo8/y4O+sgfitTGj4BYxzrhiWEKMc1b1fe1QXjx7pwMR4gsgYWuP/4t7PF+A/Dx93yranzdH5m96iX3DoYvKhMFkBJ1Ciu+E/n32wM/DMoD8pzcg+5PhjfNGxFBOc2x723JsRcU9NsyEbrWg2nUTyd6n4puuUuJvM9NVPO5xuSdR8dwO29NhIaXJPBazcZOXcSmhAO/7nKuDT5lw7UrlZ9hHGI2HddOQLrCnGVZP8Ywt3Xocj77Y1238e6EK8qCPxmdoYmvX5hx3/8v8LwSK8VL9bHH987llgoDIDgZtng/YbgupHAetfnv5Eq30Whk5gLJxElA2HMyc07K4YYD/RuX228HgicVL7PS5P4eQoUKChfNUuPT5jzONdrlTrqu+EELGaxhnPYBF9Qz/xw4azOfnKQ0=" stages: - name: lint - name: build -#- name: release -# if: (branch = master AND type = push) OR (tag IS present) +- name: release + if: (branch = master AND type = push) OR (tag IS present) jobs: include: @@ -31,11 +31,11 @@ jobs: name: "Build (JDK8, 2.12)" script: sbt ++$TRAVIS_SCALA_VERSION! coverage test coverageReport after_success: bash <(curl -s https://codecov.io/bash) -# - &release -# stage: release -# name: "Release artifacts" -# before_script: export PGP_SECRET="$(<./project/secret)" -# script: sbt ci-release || sbt sonatypeReleaseAll + - &release + stage: release + name: "Release artifacts" + before_script: export PGP_SECRET="$(<./project/secret)" + script: sbt ci-release || sbt sonatypeReleaseAll - <<: *build jdk: openjdk11 diff --git a/build.sbt b/build.sbt index 5e250e1..13fb7bb 100644 --- a/build.sbt +++ b/build.sbt @@ -18,14 +18,16 @@ parallelExecution in Test := false fork in Test := true libraryDependencies ++= Seq( - "org.slf4j" % "slf4j-api" % "1.7.25", - "org.scalaz" %% "scalaz-zio" % "0.2.9", - "com.lihaoyi" %% "utest" % "0.6.4" % Test + "com.lihaoyi" %% "sourcecode" % "0.1.4", + "com.lihaoyi" %% "utest" % "0.6.4" % Test, + "org.scalaz" %% "scalaz-core" % "7.2.26", + "org.scalaz" %% "scalaz-zio" % "0.2.9", + "org.slf4j" % "slf4j-api" % "1.7.25" ) testFrameworks += new TestFramework("utest.runner.Framework") -scalacOptions in Test ++= Seq( +scalacOptions ++= Seq( "-deprecation", "-encoding", "UTF-8", diff --git a/project/zecret b/project/zecret new file mode 100644 index 0000000..d99d0d7 Binary files /dev/null and b/project/zecret differ diff --git a/src/main/scala/console.scala b/src/main/scala/console.scala new file mode 100644 index 0000000..92ae091 --- /dev/null +++ b/src/main/scala/console.scala @@ -0,0 +1,17 @@ +package nequi.zio.logger + +import scalaz.Show +import scalaz.zio.{ console, IO } + +trait ConsoleLogger { + implicit lazy val logger: Logger = new Logger { + private def log[A](level: String)(a: A)(implicit S: Show[A]): IO[Throwable, Unit] = + console.putStrLn(s"[${level}] ${S.shows(a)}") + + def trace[A](a: A)(implicit S: Show[A]): IO[Throwable, Unit] = log("TRACE")(a) + def debug[A](a: A)(implicit S: Show[A]): IO[Throwable, Unit] = log("DEBUG")(a) + def info[A](a: A)(implicit S: Show[A]): IO[Throwable, Unit] = log("INFO")(a) + def warn[A](a: A)(implicit S: Show[A]): IO[Throwable, Unit] = log("WARN")(a) + def error[A](a: A)(implicit S: Show[A]): IO[Throwable, Unit] = log("ERROR")(a) + } +} diff --git a/src/main/scala/logger.scala b/src/main/scala/logger.scala new file mode 100644 index 0000000..40bd411 --- /dev/null +++ b/src/main/scala/logger.scala @@ -0,0 +1,12 @@ +package nequi.zio.logger + +import scalaz.Show +import scalaz.zio.IO + +trait Logger { + def trace[A: Show](a: A): IO[Throwable, Unit] + def debug[A: Show](a: A): IO[Throwable, Unit] + def info[A: Show](a: A): IO[Throwable, Unit] + def warn[A: Show](a: A): IO[Throwable, Unit] + def error[A: Show](a: A): IO[Throwable, Unit] +} diff --git a/src/main/scala/logging.scala b/src/main/scala/logging.scala new file mode 100644 index 0000000..797ebc7 --- /dev/null +++ b/src/main/scala/logging.scala @@ -0,0 +1,12 @@ +package nequi.zio.logger + +import scalaz.Show +import scalaz.zio.IO + +private[logger] trait Logging { + def trace[A: Show](a: A)(implicit L: Logger): IO[Throwable, Unit] = L.trace(a) + def debug[A: Show](a: A)(implicit L: Logger): IO[Throwable, Unit] = L.debug(a) + def info[A: Show](a: A)(implicit L: Logger): IO[Throwable, Unit] = L.info(a) + def warn[A: Show](a: A)(implicit L: Logger): IO[Throwable, Unit] = L.warn(a) + def error[A: Show](a: A)(implicit L: Logger): IO[Throwable, Unit] = L.error(a) +} diff --git a/src/main/scala/package.scala b/src/main/scala/package.scala new file mode 100644 index 0000000..7cf6e13 --- /dev/null +++ b/src/main/scala/package.scala @@ -0,0 +1,3 @@ +package nequi.zio + +package object logger extends Logging diff --git a/src/main/scala/queue.scala b/src/main/scala/queue.scala new file mode 100644 index 0000000..94a0eb1 --- /dev/null +++ b/src/main/scala/queue.scala @@ -0,0 +1,28 @@ +package nequi.zio.logger + +import java.util.ArrayDeque + +import scalaz.Show +import scalaz.zio.IO + +trait QueueLogger { + sealed trait Level + case object Trace extends Level + case object Debug extends Level + case object Info extends Level + case object Warn extends Level + case object Error extends Level + + val queue = new ArrayDeque[(Level, String)] + + implicit lazy val logger: Logger = new Logger { + def trace[A](a: A)(implicit S: Show[A]): IO[Throwable, Unit] = + IO.syncThrowable(queue.offer((Trace, S.shows(a)))).void + def debug[A](a: A)(implicit S: Show[A]): IO[Throwable, Unit] = + IO.syncThrowable(queue.offer((Debug, S.shows(a)))).void + def info[A](a: A)(implicit S: Show[A]): IO[Throwable, Unit] = IO.syncThrowable(queue.offer((Info, S.shows(a)))).void + def warn[A](a: A)(implicit S: Show[A]): IO[Throwable, Unit] = IO.syncThrowable(queue.offer((Warn, S.shows(a)))).void + def error[A](a: A)(implicit S: Show[A]): IO[Throwable, Unit] = + IO.syncThrowable(queue.offer((Error, S.shows(a)))).void + } +} diff --git a/src/main/scala/slf4j.scala b/src/main/scala/slf4j.scala new file mode 100644 index 0000000..d77c5f9 --- /dev/null +++ b/src/main/scala/slf4j.scala @@ -0,0 +1,22 @@ +package nequi.zio.logger + +import org.slf4j + +import scalaz.Show +import scalaz.zio.IO + +trait Slf4jLogger { + def clazz: sourcecode.FullName + + lazy val clazzName: String = clazz.value.stripSuffix(".clazz") + + implicit lazy val logger: Logger = new Logger { + val inner: slf4j.Logger = slf4j.LoggerFactory.getLogger(clazzName) + + def trace[A](a: A)(implicit S: Show[A]): IO[Throwable, Unit] = IO.syncThrowable(inner.trace(S.shows(a))) + def debug[A](a: A)(implicit S: Show[A]): IO[Throwable, Unit] = IO.syncThrowable(inner.debug(S.shows(a))) + def info[A](a: A)(implicit S: Show[A]): IO[Throwable, Unit] = IO.syncThrowable(inner.info(S.shows(a))) + def warn[A](a: A)(implicit S: Show[A]): IO[Throwable, Unit] = IO.syncThrowable(inner.warn(S.shows(a))) + def error[A](a: A)(implicit S: Show[A]): IO[Throwable, Unit] = IO.syncThrowable(inner.error(S.shows(a))) + } +}