Skip to content

Commit

Permalink
Upgrade to STAC 0.9.0 (stac-utils#48)
Browse files Browse the repository at this point in the history
* wip -- upgrade to stac 0.9.0

* scalafmt

* wip -- fail for NotSerializable reasons

* wip -- use unserializableCodec, which was like 10 lines away 🤦‍♂️

* sort serdespec

* restore removed test

* Add version link types

* include versions in deserialization, test

* Add label extension types and codecs

* Add all implicits for testing

* Add extensions to catalogs and collections
  • Loading branch information
jisantuc authored Mar 19, 2020
1 parent f818054 commit e7d6b2b
Show file tree
Hide file tree
Showing 33 changed files with 936 additions and 288 deletions.
1 change: 1 addition & 0 deletions .jabbarc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
[email protected]
3 changes: 3 additions & 0 deletions build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -104,9 +104,12 @@ lazy val credentialSettings = Seq(

val coreDependencies = Seq(
"org.typelevel" %% "cats-core" % Versions.CatsVersion,
"org.typelevel" %% "cats-kernel" % Versions.CatsVersion,
"io.circe" %% "circe-core" % Versions.CirceVersion,
"io.circe" %% "circe-generic" % Versions.CirceVersion,
"io.circe" %% "circe-parser" % Versions.CirceVersion,
"io.circe" %% "circe-refined" % Versions.CirceVersion,
"io.circe" %% "circe-testing" % Versions.CirceVersion % "test",
"org.locationtech.geotrellis" %% "geotrellis-vector" % Versions.GeoTrellisVersion,
"eu.timepit" %% "refined" % Versions.RefinedVersion,
"org.scalacheck" %% "scalacheck" % Versions.scalacheckVersion % Test,
Expand Down
18 changes: 13 additions & 5 deletions modules/core/src/main/scala/com/azavea/stac4s/core/Bbox.scala
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.azavea.stac4s

import cats.Eq
import cats.implicits._
import geotrellis.vector.{Extent, ExtentRangeError}
import io.circe._
Expand All @@ -12,11 +13,12 @@ sealed trait Bbox {
val ymax: Double
val toList: List[Double]

val toExtent: Either[String, Extent] = try {
Either.right(Extent(xmin, ymin, xmax, ymax))
} catch {
case e: ExtentRangeError => Either.left(e.toString)
}
val toExtent: Either[String, Extent] =
try {
Either.right(Extent(xmin, ymin, xmax, ymax))
} catch {
case e: ExtentRangeError => Either.left(e.toString)
}
}

final case class TwoDimBbox(xmin: Double, ymin: Double, xmax: Double, ymax: Double) extends Bbox {
Expand All @@ -36,6 +38,8 @@ final case class ThreeDimBbox(

object TwoDimBbox {

implicit val eqTwoDimBbox: Eq[TwoDimBbox] = Eq.fromUniversalEquals

implicit val decoderTwoDBox: Decoder[TwoDimBbox] =
Decoder.decodeList[Double].emap {
case twodim if twodim.length == 4 =>
Expand All @@ -55,6 +59,8 @@ object TwoDimBbox {

object ThreeDimBbox {

implicit val eqThreeDimBbox: Eq[ThreeDimBbox] = Eq.fromUniversalEquals

implicit val decoderThreeDimBox: Decoder[ThreeDimBbox] =
Decoder.decodeList[Double].emap {
case threeDim if threeDim.length == 6 =>
Expand Down Expand Up @@ -93,4 +99,6 @@ object Bbox {

implicit val decoderBbox: Decoder[Bbox] = Decoder[TwoDimBbox].widen or Decoder[ThreeDimBbox].widen

implicit val eqBbox: Eq[Bbox] = Eq.fromUniversalEquals

}
Original file line number Diff line number Diff line change
@@ -1,30 +1,41 @@
package com.azavea.stac4s

import cats.Eq
import io.circe._
import io.circe.refined._

final case class ItemCollection(
_type: String = "FeatureCollection",
stacVersion: StacVersion,
stacExtensions: List[String],
features: List[StacItem],
links: List[StacLink]
)

object ItemCollection {

implicit val encItemCollection: Encoder[ItemCollection] = Encoder.forProduct3(
implicit val eqItemCollection: Eq[ItemCollection] = Eq.fromUniversalEquals

implicit val encItemCollection: Encoder[ItemCollection] = Encoder.forProduct5(
"type",
"stac_version",
"stac_extensions",
"features",
"links"
)(
itemCollection =>
(
itemCollection._type,
itemCollection.features,
itemCollection.links
)
)(itemCollection =>
(
itemCollection._type,
itemCollection.stacVersion,
itemCollection.stacExtensions,
itemCollection.features,
itemCollection.links
)
)

implicit val decItemCollection: Decoder[ItemCollection] = Decoder.forProduct3(
implicit val decItemCollection: Decoder[ItemCollection] = Decoder.forProduct5(
"type",
"stac_version",
"stac_extensions",
"features",
"links"
)(ItemCollection.apply _)
Expand Down
22 changes: 0 additions & 22 deletions modules/core/src/main/scala/com/azavea/stac4s/core/StacAsset.scala

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.azavea.stac4s

import cats.Eq
import cats.implicits._
import io.circe.{Decoder, Encoder}

sealed abstract class StacAssetRole(val repr: String) {
override def toString = repr
}

object StacAssetRole {

implicit def eqStacAssetRole: Eq[StacAssetRole] = Eq[String].imap(fromString _)(_.repr)

case object Thumbnail extends StacAssetRole("thumbnail")
case object Overview extends StacAssetRole("overview")
case object Data extends StacAssetRole("data")
case object Metadata extends StacAssetRole("metadata")
final case class VendorAsset(s: String) extends StacAssetRole(s)

private def fromString(s: String): StacAssetRole = s.toLowerCase match {
case "thumbnail" => Thumbnail
case "overview" => Overview
case "data" => Data
case "metadata" => Metadata
case s => VendorAsset(s)
}

implicit val encStacAssetRole: Encoder[StacAssetRole] =
Encoder.encodeString.contramap[StacAssetRole](_.toString)

implicit val decStacAssetRole: Decoder[StacAssetRole] =
Decoder.decodeString.emap { str => Either.catchNonFatal(fromString(str)).leftMap(_ => "StacAssetRole") }
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
package com.azavea.stac4s

import cats.Eq
import io.circe._

final case class StacCatalog(
stacVersion: String,
stacExtensions: List[String],
id: String,
title: Option[String],
description: String,
Expand All @@ -12,18 +14,20 @@ final case class StacCatalog(

object StacCatalog {

implicit val eqStacCatalog: Eq[StacCatalog] = Eq.fromUniversalEquals

implicit val encCatalog: Encoder[StacCatalog] =
Encoder.forProduct5("stac_version", "id", "title", "description", "links")(
catalog =>
(
catalog.stacVersion,
catalog.id,
catalog.title,
catalog.description,
catalog.links
)
Encoder.forProduct6("stac_version", "stac_extensions", "id", "title", "description", "links")(catalog =>
(
catalog.stacVersion,
catalog.stacExtensions,
catalog.id,
catalog.title,
catalog.description,
catalog.links
)
)

implicit val decCatalog: Decoder[StacCatalog] =
Decoder.forProduct5("stac_version", "id", "title", "description", "links")(StacCatalog.apply _)
Decoder.forProduct6("stac_version", "stac_extensions", "id", "title", "description", "links")(StacCatalog.apply _)
}
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
package com.azavea.stac4s

import cats.Eq
import geotrellis.vector.{io => _}
import io.circe._

final case class StacCollection(
stacVersion: String,
stacExtensions: List[String],
id: String,
title: Option[String],
description: String,
keywords: List[String],
version: String,
license: StacLicense,
providers: List[StacProvider],
extent: StacExtent,
Expand All @@ -19,44 +20,45 @@ final case class StacCollection(

object StacCollection {

implicit val eqStacCollection: Eq[StacCollection] = Eq.fromUniversalEquals

implicit val encoderStacCollection: Encoder[StacCollection] =
Encoder.forProduct11(
"stac_version",
"stac_extensions",
"id",
"title",
"description",
"keywords",
"version",
"license",
"providers",
"extent",
"properties",
"links"
)(
collection =>
(
collection.stacVersion,
collection.id,
collection.title,
collection.description,
collection.keywords,
collection.version,
collection.license,
collection.providers,
collection.extent,
collection.properties,
collection.links
)
)(collection =>
(
collection.stacVersion,
collection.stacExtensions,
collection.id,
collection.title,
collection.description,
collection.keywords,
collection.license,
collection.providers,
collection.extent,
collection.properties,
collection.links
)
)

implicit val decoderStacCollection: Decoder[StacCollection] =
Decoder.forProduct11(
"stac_version",
"stac_extensions",
"id",
"title",
"description",
"keywords",
"version",
"license",
"providers",
"extent",
Expand All @@ -65,11 +67,11 @@ object StacCollection {
)(
(
stacVersion: String,
stacExtensions: List[String],
id: String,
title: Option[String],
description: String,
keywords: Option[List[String]],
version: Option[String],
license: StacLicense,
providers: Option[List[StacProvider]],
extent: StacExtent,
Expand All @@ -78,11 +80,11 @@ object StacCollection {
) =>
StacCollection(
stacVersion,
stacExtensions,
id,
title,
description,
keywords getOrElse List.empty,
version getOrElse "0.0.0-alpha",
license,
providers getOrElse List.empty,
extent,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.azavea.stac4s

import cats.Eq
import io.circe._

final case class StacCollectionAsset(
title: String,
description: Option[String],
roles: List[StacAssetRole],
_type: StacMediaType
)

object StacCollectionAsset {

implicit val eqStacCollectionAsset: Eq[StacCollectionAsset] = Eq.fromUniversalEquals

implicit val encStacCollectionAsset: Encoder[StacCollectionAsset] =
Encoder.forProduct4("title", "description", "roles", "type")(asset =>
(asset.title, asset.description, asset.roles, asset._type)
)

implicit val decStacCollectionAsset: Decoder[StacCollectionAsset] =
Decoder.forProduct4("title", "description", "roles", "type")(
StacCollectionAsset.apply _
)
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package com.azavea.stac4s

import com.azavea.stac4s.meta._

import cats.Eq
import io.circe._
import io.circe.generic.semiauto._

Expand All @@ -24,6 +26,7 @@ final case class StacExtent(
)

object StacExtent {
implicit val eqStacExtent: Eq[StacExtent] = Eq.fromUniversalEquals
implicit val encStacExtent: Encoder[StacExtent] = deriveEncoder
implicit val decStacExtent: Decoder[StacExtent] = deriveDecoder
}
Loading

0 comments on commit e7d6b2b

Please sign in to comment.