From d9379dd385b45edfa7af8416c412c22f7436490b Mon Sep 17 00:00:00 2001 From: Anton Parkhomenko Date: Thu, 18 Jun 2020 03:15:52 +0700 Subject: [PATCH 1/9] Bump jackson-databind to 2.10.3 (close #143) --- project/Dependencies.scala | 6 +++--- src/main/scala/io/circe/jackson/snowplow/package.scala | 10 +++++++--- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/project/Dependencies.scala b/project/Dependencies.scala index d0965be6..abb256cf 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -16,6 +16,7 @@ object Dependencies { // Java val validator = "1.0.39" val slf4j = "1.7.26" + val jackson = "2.10.3" // Scala val igluCore = "1.0.0" val cats = "2.1.1" @@ -30,9 +31,8 @@ object Dependencies { object Libraries { // Java // Excluding binary-incompatible Jackson and include the latest from 2.9 series - val validatorFull = "com.networknt" % "json-schema-validator" % V.validator - val validator = validatorFull.exclude("com.fasterxml.jackson.core", "jackson-databind") - val jackson = "com.fasterxml.jackson.core" % "jackson-databind" % "2.9.10.1" + val validator = "com.networknt" % "json-schema-validator" % V.validator + val jackson = "com.fasterxml.jackson.core" % "jackson-databind" % V.jackson // Scala val igluCore = "com.snowplowanalytics" %% "iglu-core" % V.igluCore diff --git a/src/main/scala/io/circe/jackson/snowplow/package.scala b/src/main/scala/io/circe/jackson/snowplow/package.scala index fe221a1b..5010f1f3 100644 --- a/src/main/scala/io/circe/jackson/snowplow/package.scala +++ b/src/main/scala/io/circe/jackson/snowplow/package.scala @@ -61,13 +61,17 @@ package object snowplow { } } }, - TextNode.valueOf(_), + s => TextNode.valueOf(s), array => JsonNodeFactory.instance.arrayNode.addAll(array.map(circeToJackson).asJava), obj => - JsonNodeFactory.instance.objectNode - .setAll(obj.toMap.map { case (k, v) => (k, circeToJackson(v)) }.toMap.asJava) + objectNodeSetAll(JsonNodeFactory.instance.objectNode, obj.toMap.map { + case (k, v) => (k, circeToJackson(v)) + }.asJava) ) + def objectNodeSetAll(node: ObjectNode, fields: java.util.Map[String, JsonNode]): JsonNode = + node.setAll[JsonNode](fields) + private def getJsonNodeFromStringContent(content: String): JsonNode = mapper.readTree(content) } From ef889ffee86c283416337e4d743f379dbfcfbb5d Mon Sep 17 00:00:00 2001 From: Anton Parkhomenko Date: Thu, 18 Jun 2020 03:16:17 +0700 Subject: [PATCH 2/9] Remove exclusiveMinimum and exclusiveMaximum properties from from metaschema (close #132) --- .../client/validator/CirceValidator.scala | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/main/scala/com.snowplowanalytics.iglu/client/validator/CirceValidator.scala b/src/main/scala/com.snowplowanalytics.iglu/client/validator/CirceValidator.scala index d39cf6f1..326c2bed 100644 --- a/src/main/scala/com.snowplowanalytics.iglu/client/validator/CirceValidator.scala +++ b/src/main/scala/com.snowplowanalytics.iglu/client/validator/CirceValidator.scala @@ -77,8 +77,7 @@ object CirceValidator extends Validator[Json] { | "default": {}, | "multipleOf": { | "type": "number", - | "minimum": 0, - | "exclusiveMinimum": true + | "minimum": 0 | }, | "maximum": { | "type": "number" @@ -90,10 +89,6 @@ object CirceValidator extends Validator[Json] { | "minimum": { | "type": "number" | }, - | "exclusiveMinimum": { - | "type": "boolean", - | "default": false - | }, | "maxLength": { "$ref": "#/definitions/positiveInteger" }, | "minLength": { "$ref": "#/definitions/positiveIntegerDefault0" }, | "pattern": { @@ -177,8 +172,7 @@ object CirceValidator extends Validator[Json] { | "not": { "$ref": "#" } | }, | "dependencies": { - | "exclusiveMaximum": [ "maximum" ], - | "exclusiveMinimum": [ "minimum" ] + | "exclusiveMaximum": [ "maximum" ] | }, | "default": {} |}""".stripMargin From c03d0a81ef6538f363804353a494207448a47be4 Mon Sep 17 00:00:00 2001 From: Anton Parkhomenko Date: Thu, 18 Jun 2020 03:17:06 +0700 Subject: [PATCH 3/9] Bump slf4j to 1.7.30 (close #145) --- project/Dependencies.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Dependencies.scala b/project/Dependencies.scala index abb256cf..48f7cd92 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -15,7 +15,7 @@ object Dependencies { object V { // Java val validator = "1.0.39" - val slf4j = "1.7.26" + val slf4j = "1.7.30" val jackson = "2.10.3" // Scala val igluCore = "1.0.0" From 02f1cdfd84afa152ec4d0e78522e9dd521c95346 Mon Sep 17 00:00:00 2001 From: Anton Parkhomenko Date: Thu, 18 Jun 2020 03:18:46 +0700 Subject: [PATCH 4/9] Bump Scala to 2.12.11 (close #146) --- .travis.yml | 4 ++-- project/BuildSettings.scala | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index add6428f..fdb0ba6e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,7 +2,7 @@ language: scala os: linux dist: trusty scala: -- 2.12.8 +- 2.12.11 - 2.13.2 jdk: - openjdk8 @@ -18,7 +18,7 @@ deploy: provider: script script: "./.travis/deploy.sh $TRAVIS_TAG" on: - condition: '"${TRAVIS_SCALA_VERSION}" == "2.12.8"' + condition: '"${TRAVIS_SCALA_VERSION}" == "2.12.11"' tags: true env: global: diff --git a/project/BuildSettings.scala b/project/BuildSettings.scala index 7c86383d..276b4cfa 100644 --- a/project/BuildSettings.scala +++ b/project/BuildSettings.scala @@ -38,7 +38,7 @@ object BuildSettings { lazy val buildSettings = Seq[Setting[_]]( organization := "com.snowplowanalytics", scalaVersion := "2.13.2", - crossScalaVersions := Seq("2.12.8", "2.13.2"), + crossScalaVersions := Seq("2.12.11", "2.13.2"), addCompilerPlugin("org.typelevel" %% "kind-projector" % "0.11.0" cross CrossVersion.full), From 3434e818f0c8eebbdbf3e1fdc5f755abc22c146c Mon Sep 17 00:00:00 2001 From: Dilyan Damyanov Date: Fri, 24 Jan 2020 17:15:21 +0300 Subject: [PATCH 5/9] Replace Map with SortedMap in ResolutionError (close #147) --- .../client/ClientError.scala | 8 ++++---- .../client/resolver/Resolver.scala | 10 +++++----- .../ClientErrorSpec.scala | 7 +++---- .../resolver/ResolverSpec.scala | 8 +++++--- 4 files changed, 17 insertions(+), 16 deletions(-) diff --git a/src/main/scala/com.snowplowanalytics.iglu/client/ClientError.scala b/src/main/scala/com.snowplowanalytics.iglu/client/ClientError.scala index a9466151..60f32aa4 100644 --- a/src/main/scala/com.snowplowanalytics.iglu/client/ClientError.scala +++ b/src/main/scala/com.snowplowanalytics.iglu/client/ClientError.scala @@ -17,14 +17,14 @@ import java.time.Instant import cats.Show import cats.syntax.show._ import cats.syntax.either._ - import io.circe.{Decoder, DecodingFailure, Encoder, Json} import io.circe.syntax._ - import validator.ValidatorError import resolver.LookupHistory import resolver.registries.RegistryError +import scala.collection.immutable.SortedMap + /** Common type for Resolver's and Validator's errors */ sealed trait ClientError extends Product with Serializable { def getMessage: String = @@ -34,7 +34,7 @@ sealed trait ClientError extends Product with Serializable { object ClientError { /** Error happened during schema resolution step */ - final case class ResolutionError(value: Map[String, LookupHistory]) extends ClientError { + final case class ResolutionError(value: SortedMap[String, LookupHistory]) extends ClientError { def isNotFound: Boolean = value.values.flatMap(_.errors).forall(_ == RegistryError.NotFound) } @@ -67,7 +67,7 @@ object ClientError { .downField("lookupHistory") .as[List[RepoLookupHistory]] .map { history => - ResolutionError(history.map(_.toField).toMap) + ResolutionError(SortedMap[String, LookupHistory]() ++ history.map(_.toField).toMap) } case "ValidationError" => cursor diff --git a/src/main/scala/com.snowplowanalytics.iglu/client/resolver/Resolver.scala b/src/main/scala/com.snowplowanalytics.iglu/client/resolver/Resolver.scala index f7cd69b1..946e898e 100644 --- a/src/main/scala/com.snowplowanalytics.iglu/client/resolver/Resolver.scala +++ b/src/main/scala/com.snowplowanalytics.iglu/client/resolver/Resolver.scala @@ -17,13 +17,10 @@ import cats.{Applicative, Id, Monad} import java.time.Instant import scala.concurrent.duration.MILLISECONDS - import cats.data._ import cats.effect.Clock import cats.implicits._ - import io.circe.{Decoder, DecodingFailure, HCursor, Json} - import com.snowplowanalytics.iglu.core.{ SchemaCriterion, SchemaKey, @@ -34,7 +31,6 @@ import com.snowplowanalytics.iglu.core.{ SelfDescribingSchema } import com.snowplowanalytics.iglu.core.circe.CirceIgluCodecs._ - import com.snowplowanalytics.iglu.client.ClientError.ResolutionError import com.snowplowanalytics.iglu.client.resolver.registries.{ Registry, @@ -43,6 +39,8 @@ import com.snowplowanalytics.iglu.client.resolver.registries.{ } import com.snowplowanalytics.iglu.client.resolver.registries.Registry.Get +import scala.collection.immutable.SortedMap + /** Resolves schemas from one or more Iglu schema registries */ final case class Resolver[F[_]](repos: List[Registry], cache: Option[ResolverCache[F]]) { import Resolver._ @@ -295,7 +293,9 @@ object Resolver { private def postProcess[F[_], A](result: Either[LookupFailureMap, A]) = result.leftMap { failure => - ResolutionError(failure.map { case (key, value) => (key.config.name, value) }) + ResolutionError(SortedMap[String, LookupHistory]() ++ failure.map { + case (key, value) => (key.config.name, value) + }) } private def matchConfig[F[_]: Applicative](datum: SelfDescribingData[Json]) = { diff --git a/src/test/scala/com.snowplowanalytics.iglu.client/ClientErrorSpec.scala b/src/test/scala/com.snowplowanalytics.iglu.client/ClientErrorSpec.scala index 5d2c626d..0fac976a 100644 --- a/src/test/scala/com.snowplowanalytics.iglu.client/ClientErrorSpec.scala +++ b/src/test/scala/com.snowplowanalytics.iglu.client/ClientErrorSpec.scala @@ -13,16 +13,15 @@ package com.snowplowanalytics.iglu.client import cats.data.NonEmptyList - import io.circe.syntax._ import io.circe.literal._ - import com.snowplowanalytics.iglu.client.resolver.LookupHistory import com.snowplowanalytics.iglu.client.resolver.registries.RegistryError import com.snowplowanalytics.iglu.client.validator.{ValidatorError, ValidatorReport} - import org.specs2.Specification +import scala.collection.immutable.SortedMap + class ClientErrorSpec extends Specification { def is = s2""" @@ -32,7 +31,7 @@ class ClientErrorSpec extends Specification { def e1 = { val error: ClientError = ClientError.ResolutionError( - Map( + SortedMap( "First repo" -> LookupHistory( Set(RegistryError.NotFound, RegistryError.RepoFailure("Server outage")), 1, diff --git a/src/test/scala/com.snowplowanalytics.iglu.client/resolver/ResolverSpec.scala b/src/test/scala/com.snowplowanalytics.iglu.client/resolver/ResolverSpec.scala index 00f593ad..48f9cc3c 100644 --- a/src/test/scala/com.snowplowanalytics.iglu.client/resolver/ResolverSpec.scala +++ b/src/test/scala/com.snowplowanalytics.iglu.client/resolver/ResolverSpec.scala @@ -15,6 +15,8 @@ package com.snowplowanalytics.iglu.client.resolver import java.time.Instant import java.net.URI +import scala.collection.immutable.SortedMap + // Cats import cats.Id import cats.effect.IO @@ -132,7 +134,7 @@ class ResolverSpec extends Specification with DataTables with ValidatedMatchers val schemaKey = SchemaKey("com.acme.icarus", "wing", "jsonschema", SchemaVer.Full(1, 0, 0)) val expected = ResolutionError( - Map( + SortedMap( "Iglu Client Embedded" -> LookupHistory(Set(RegistryError.NotFound), 1, SpecHelpers.now), "Iglu Test Embedded" -> LookupHistory(Set(RegistryError.NotFound), 1, SpecHelpers.now) )) @@ -151,7 +153,7 @@ class ResolverSpec extends Specification with DataTables with ValidatedMatchers "jsonschema", SchemaVer.Full(1, 0, 0)) val expected = ResolutionError( - Map( + SortedMap( "Iglu Client Embedded" -> LookupHistory(Set(RegistryError.NotFound), 1, SpecHelpers.now), "Iglu Test Embedded" -> LookupHistory( Set(RegistryError.RepoFailure("ParsingFailure: exhausted input")), @@ -312,7 +314,7 @@ class ResolverSpec extends Specification with DataTables with ValidatedMatchers Nil) val expected = ResolutionError( - Map( + SortedMap( "Mock Repo 1" -> LookupHistory(Set(error1, error2), 2, Instant.ofEpochMilli(2008L)), "Mock Repo 2" -> LookupHistory(Set(error3, error4), 2, Instant.ofEpochMilli(2009L)), "Iglu Client Embedded" -> LookupHistory( From d91a1ef62d735de5e82f918e82cf949d39486c4b Mon Sep 17 00:00:00 2001 From: Anton Parkhomenko Date: Thu, 18 Jun 2020 03:40:07 +0700 Subject: [PATCH 6/9] Add Snyk token to .travis.yml (close #150) --- .travis.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index fdb0ba6e..0d85bf0a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,11 +8,13 @@ jdk: - openjdk8 addons: hostname: short-hostname -before_install: 'openssl aes-256-cbc -K $encrypted_38b5cd286219_key -iv $encrypted_38b5cd286219_iv -in project/travis-deploy-key.enc -out project/travis-deploy-key -d' +before_install: +- openssl aes-256-cbc -K $encrypted_38b5cd286219_key -iv $encrypted_38b5cd286219_iv + -in project/travis-deploy-key.enc -out project/travis-deploy-key -d script: - sbt clean coverage +test - sbt coverageReport -after_success: "sbt coveralls" +after_success: sbt coveralls deploy: cleanup: false provider: script @@ -28,3 +30,4 @@ env: - secure: ZdJH16Iz79TTwPCha92BuekZP07QsLAxMqaG4liH45ncK4TE+xfEE0lAmt2SqonPodXDbx94cFwjTEum0xFsEOp1ASsz393i265+qVKT+WwumpMe1/4Ta9UF6bAZMBQSeikgW7Qnh7uN2DVUKJ9LNrCg3xlBReWeqJC/1AjD+TM= - ENCRYPTION_LABEL: 38b5cd286219 - secure: PQ/P9MzZt5vczMZBgrKQD2+lvFkwJJI644MxxUf1xX0SBocvyuB5xkjdlgmbQHtRW90WgiSJJ2AO+lj/SNc61zHyZaC1YrrPzbJZPTNzihcsWvKBJKdMOX3OpN3+eXmY5JgKcZ7MRiCIetuRkZ8LkdThl8DCFGvtPmNHayqpCOk= + - secure: cAcmKufGhrguRB471CXwhcqBrcbQfgqhnRoH7VjlISpIKBEPAV6x8inrkGfaT99KCDtqLdDT59bZUy8IBiqn9Xijzd9dZkM6uU8WCecLN0gnE1WNPCicikSNYDOLnK+tFkWpZgfqy+jCu6BpRa49audc7rpy4tGv2w+JyIr9clo= From 9b61b7045efa619fca45c69c4d58452e1a631061 Mon Sep 17 00:00:00 2001 From: Anton Parkhomenko Date: Thu, 18 Jun 2020 03:54:25 +0700 Subject: [PATCH 7/9] Integrate Synk (close #149) --- .travis.yml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 0d85bf0a..78ca60d7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,12 +9,14 @@ jdk: addons: hostname: short-hostname before_install: -- openssl aes-256-cbc -K $encrypted_38b5cd286219_key -iv $encrypted_38b5cd286219_iv - -in project/travis-deploy-key.enc -out project/travis-deploy-key -d +- openssl aes-256-cbc -K $encrypted_38b5cd286219_key -iv $encrypted_38b5cd286219_iv -in project/travis-deploy-key.enc -out project/travis-deploy-key -d +- npm install -g snyk script: - sbt clean coverage +test - sbt coverageReport -after_success: sbt coveralls +after_success: +- snyk monitor +- sbt coveralls deploy: cleanup: false provider: script From 16c808e3edba6cd411a09d352626ffa5d54c4b4d Mon Sep 17 00:00:00 2001 From: Anton Parkhomenko Date: Thu, 18 Jun 2020 03:27:36 +0700 Subject: [PATCH 8/9] Prepare for release --- CHANGELOG | 8 ++++++++ README.md | 4 ++-- build.sbt | 2 +- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index c309d38f..ebbf7202 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,11 @@ +Version 1.0.2 (2020-06-18) +-------------------------- +Replace Map with SortedMap in ResolutionError (#147) +Remove exclusiveMinimum and exclusiveMaximum properties from from metaschema (#132) +Bump Scala to 2.12.11 (#146) +Bump slf4j to 1.7.30 (#145) +Bump jackson-databind to 2.10.3 (#143) + Version 1.0.1 (2020-06-11) -------------------------- Bump SBT to 1.3.12 (#142) diff --git a/README.md b/README.md index ee4fd66f..f29ca456 100644 --- a/README.md +++ b/README.md @@ -13,12 +13,12 @@ Iglu Scala Client is used extensively in **[Snowplow][snowplow-repo]** to valida ## Installation -The latest version of Iglu Scala Client is 1.0.1, which currently works with Scala 2.12 and 2.13. +The latest version of Iglu Scala Client is 1.0.2, which currently works with Scala 2.12 and 2.13. If you're using SBT, add the following lines to your build file: ```scala -val igluClient = "com.snowplowanalytics" %% "iglu-scala-client" % "1.0.1" +val igluClient = "com.snowplowanalytics" %% "iglu-scala-client" % "1.0.2" ``` ## API diff --git a/build.sbt b/build.sbt index 65e7fb9e..1bc79c86 100644 --- a/build.sbt +++ b/build.sbt @@ -14,7 +14,7 @@ lazy val root = (project in file(".")) .settings( name := "iglu-scala-client", - version := "1.0.1", + version := "1.0.2", description := "Scala client and resolver for Iglu schema repositories" ) .enablePlugins(SiteScaladocPlugin, GhpagesPlugin, PreprocessPlugin) From ac97cb749c18fa1ec6b78b9f0dc2c79f7d0a3970 Mon Sep 17 00:00:00 2001 From: Anton Parkhomenko Date: Thu, 18 Jun 2020 03:28:40 +0700 Subject: [PATCH 9/9] bump --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index 1bc79c86..4f802fbf 100644 --- a/build.sbt +++ b/build.sbt @@ -14,7 +14,7 @@ lazy val root = (project in file(".")) .settings( name := "iglu-scala-client", - version := "1.0.2", + version := "1.0.2-M2", description := "Scala client and resolver for Iglu schema repositories" ) .enablePlugins(SiteScaladocPlugin, GhpagesPlugin, PreprocessPlugin)