Skip to content

Commit

Permalink
Cross-publish core module (stac-utils#157)
Browse files Browse the repository at this point in the history
* Add ScalaJS plugin / project

* move core src to shared

* add a geometry type to js module

* reorganize testing code for x-publication

* add js tests

* fill in geom generators, run js tests

* lol just add a `-node` ♥

* get tests to fail (!!)

* move spdxid enum to shared

* remove unused

* upgrade scalajs plugin

* fix dependency declarations

dependencies with %%% can't be stored in top-level declarations, so
they instead need all to live inside settings macros. this moves
everything and isolates the jvm deps

* prefer scalafix sort imports rule

* add OrganizeImports scalafix rule

* organize imports

* fully separate js and jvm time and meta types

* mirror JVM layout with scalajs java.time package

* update gitignore

* lint

* declare scala-java-time dep in the correct place

* fix geometry encoder

* fix polygon generator

* move scala-java-time dependency to Test

* Update changelog

* make root a cross-project and rely on aggregate

* lint

* suppress one scapegoat warning

* only run sbt-explicit-dependencies against JVM

better scala.js support seems low priority:
cb372/sbt-explicit-dependencies#27
  • Loading branch information
jisantuc authored Nov 18, 2020
1 parent 9c60c20 commit e3421d9
Show file tree
Hide file tree
Showing 82 changed files with 1,193 additions and 309 deletions.
2 changes: 1 addition & 1 deletion .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ aliases:

- &openjdk8-scala2_12_environment
docker:
- image: circleci/openjdk:8-jdk
- image: circleci/openjdk:8-jdk-node
environment:
# https://circleci.com/docs/2.0/java-oom/
_JAVA_OPTIONS: "-Xms128m -Xmx2g"
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@ project/plugins/project/
metals.lock.db
.metals/
.bloop/
project/

/.env
/.envrc
Expand Down
1 change: 1 addition & 0 deletions .nvmrc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
v14.15.0
16 changes: 14 additions & 2 deletions .scalafix.conf
Original file line number Diff line number Diff line change
@@ -1,4 +1,16 @@
rules = [
ProcedureSyntax,
RemoveUnused
]
RemoveUnused,
OrganizeImports
]

OrganizeImports {
coalesceToWildcardImportThreshold = 2147483647 # Int.MaxValue
expandRelative = true
groupExplicitlyImportedImplicitsSeparately = false
groupedImports = Merge
groups = ["com.azavea.stac4s", "*", "scala.", "re:javax?\\."]
importSelectorsOrder = Ascii
importsOrder = Ascii
removeUnused = true
}
3 changes: 1 addition & 2 deletions .scalafmt.conf
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
version = 2.7.5
align = more // For pretty alignment.
align = more // For pretty alignment.
maxColumn = 120
rewrite.rules = [SortImports]
newlines.alwaysBeforeTopLevelStatements = true
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).

## [Unreleased]
### Added
- Added cross-project configuration for Scala.js modules [#157](https://github.com/azavea/stac4s/pull/157)

## [0.0.17] - 2020-11-11
### Changed
Expand Down
107 changes: 68 additions & 39 deletions build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,8 @@ lazy val commonSettings = Seq(
Resolver.file("local", file(Path.userHome.absolutePath + "/.ivy2/local"))(
Resolver.ivyStylePatterns
)
)
),
scalafixDependencies in ThisBuild += "com.github.liancheng" %% "organize-imports" % "0.4.3"
)

lazy val noPublishSettings = Seq(
Expand Down Expand Up @@ -102,70 +103,98 @@ lazy val credentialSettings = Seq(
).flatten
)

val coreDependencies = Seq(
"com.beachape" %% "enumeratum" % Versions.EnumeratumVersion,
"com.beachape" %% "enumeratum-circe" % Versions.EnumeratumVersion,
"com.chuusai" %% "shapeless" % Versions.ShapelessVersion,
"eu.timepit" %% "refined" % Versions.RefinedVersion,
"io.circe" %% "circe-core" % Versions.CirceVersion,
"io.circe" %% "circe-generic" % Versions.CirceVersion,
"io.circe" %% "circe-parser" % Versions.CirceVersion,
"io.circe" %% "circe-refined" % Versions.CirceVersion,
"org.locationtech.geotrellis" %% "geotrellis-vector" % Versions.GeoTrellisVersion,
val coreDependenciesJVM = Seq(
"org.locationtech.jts" % "jts-core" % Versions.Jts,
"org.typelevel" %% "cats-core" % Versions.CatsVersion,
"org.typelevel" %% "cats-kernel" % Versions.CatsVersion
"org.locationtech.geotrellis" %% "geotrellis-vector" % Versions.GeoTrellisVersion
)

val testingDependencies = Seq(
"com.beachape" %% "enumeratum" % Versions.EnumeratumVersion,
"com.beachape" %% "enumeratum-scalacheck" % Versions.EnumeratumVersion,
"com.chuusai" %% "shapeless" % Versions.ShapelessVersion,
"eu.timepit" %% "refined-scalacheck" % Versions.RefinedVersion,
"eu.timepit" %% "refined" % Versions.RefinedVersion,
"io.chrisdavenport" %% "cats-scalacheck" % Versions.ScalacheckCatsVersion,
"io.circe" %% "circe-core" % Versions.CirceVersion,
"org.locationtech.geotrellis" %% "geotrellis-vector" % Versions.GeoTrellisVersion,
"org.locationtech.jts" % "jts-core" % Versions.Jts,
"org.scalacheck" %% "scalacheck" % Versions.ScalacheckVersion,
"org.typelevel" %% "cats-core" % Versions.CatsVersion
val testingDependenciesJVM = Seq(
"org.locationtech.geotrellis" %% "geotrellis-vector" % Versions.GeoTrellisVersion,
"org.locationtech.jts" % "jts-core" % Versions.Jts
)

val testRunnerDependencies = Seq(
"io.circe" %% "circe-testing" % Versions.CirceVersion,
"org.scalatest" %% "scalatest" % Versions.ScalatestVersion,
"org.scalatestplus" %% "scalacheck-1-14" % Versions.ScalatestPlusScalacheck
val testRunnerDependenciesJVM = Seq(
"io.circe" %% "circe-testing" % Versions.CirceVersion % Test,
"org.scalatest" %% "scalatest" % Versions.ScalatestVersion % Test,
"org.scalatestplus" %% "scalacheck-1-14" % Versions.ScalatestPlusScalacheck % Test
)

lazy val root = project
lazy val root = crossProject(JSPlatform, JVMPlatform)
.in(file("."))
.settings(moduleName := "root")
.settings(commonSettings)
.settings(publishSettings)
.settings(noPublishSettings)
.aggregate(core, testing, coreTest)

lazy val core = (project in file("modules/core"))
lazy val core = crossProject(JSPlatform, JVMPlatform)
.in(file("modules/core"))
.settings(commonSettings)
.settings(publishSettings)
.settings({
libraryDependencies ++= coreDependencies
libraryDependencies ++= Seq(
"com.beachape" %%% "enumeratum" % Versions.EnumeratumVersion,
"com.beachape" %%% "enumeratum-circe" % Versions.EnumeratumVersion,
"com.chuusai" %%% "shapeless" % Versions.ShapelessVersion,
"eu.timepit" %%% "refined" % Versions.RefinedVersion,
"io.circe" %%% "circe-core" % Versions.CirceVersion,
"io.circe" %%% "circe-generic" % Versions.CirceVersion,
"io.circe" %%% "circe-parser" % Versions.CirceVersion,
"io.circe" %%% "circe-refined" % Versions.CirceVersion,
"org.typelevel" %%% "cats-core" % Versions.CatsVersion,
"org.typelevel" %%% "cats-kernel" % Versions.CatsVersion
)
})
.jvmSettings(
libraryDependencies ++= coreDependenciesJVM
)
.jsSettings(
libraryDependencies ++= Seq(
"io.github.cquiroz" %% "scala-java-time" % "2.0.0"
)
)

lazy val coreRef = LocalProject("modules/core")
lazy val coreJvm = core.jvm
lazy val coreJs = core.js

lazy val testing = (project in file("modules/testing"))
lazy val testing = (crossProject(JSPlatform, JVMPlatform))
.in(file("modules/testing"))
.dependsOn(core)
.settings(commonSettings)
.settings(publishSettings)
.settings(libraryDependencies ++= testingDependencies)
.settings(
libraryDependencies ++= Seq(
"com.beachape" %%% "enumeratum" % Versions.EnumeratumVersion,
"com.beachape" %%% "enumeratum-scalacheck" % Versions.EnumeratumVersion,
"com.chuusai" %%% "shapeless" % Versions.ShapelessVersion,
"eu.timepit" %%% "refined-scalacheck" % Versions.RefinedVersion,
"eu.timepit" %%% "refined" % Versions.RefinedVersion,
"io.chrisdavenport" %%% "cats-scalacheck" % Versions.ScalacheckCatsVersion,
"io.circe" %%% "circe-core" % Versions.CirceVersion,
"org.scalacheck" %%% "scalacheck" % Versions.ScalacheckVersion,
"org.typelevel" %%% "cats-core" % Versions.CatsVersion
)
)
.jvmSettings(libraryDependencies ++= testingDependenciesJVM)

lazy val testingRef = LocalProject("modules/testing")
lazy val testingJvm = testing.jvm

lazy val coreTest = (project in file("modules/core-test"))
lazy val coreTest = crossProject(JSPlatform, JVMPlatform)
.in(file("modules/core-test"))
.dependsOn(testing % Test)
.settings(commonSettings)
.settings(noPublishSettings)
.settings(libraryDependencies ++= testRunnerDependencies map { _ % Test })
.settings(
libraryDependencies ++= Seq(
"io.circe" %%% "circe-testing" % Versions.CirceVersion % Test,
"org.scalatest" %%% "scalatest" % Versions.ScalatestVersion % Test,
"org.scalatestplus" %%% "scalacheck-1-14" % Versions.ScalatestPlusScalacheck % Test
)
)
.jsSettings(
libraryDependencies ++= Seq(
"io.github.cquiroz" %%% "scala-java-time" % "2.0.0" % Test
)
)

lazy val coreTestRef = LocalProject("modules/core-test")
lazy val coreTestJvm = coreTest.jvm
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.azavea.stac4s

import com.azavea.stac4s.geometry.Geometry
import com.azavea.stac4s.testing.JsInstances._

import io.circe.testing.{ArbitraryInstances, CodecTests}
import org.scalatest.funsuite.AnyFunSuite
import org.scalatest.matchers.must.Matchers
import org.scalatestplus.scalacheck.Checkers
import org.typelevel.discipline.scalatest.FunSuiteDiscipline

class JsSerDeSpec extends AnyFunSuite with FunSuiteDiscipline with Checkers with Matchers with ArbitraryInstances {
checkAll("Codec.ItemCollection", CodecTests[ItemCollection].unserializableCodec)
checkAll("Codec.StacItem", CodecTests[StacItem].unserializableCodec)
checkAll("Codec.Geometry", CodecTests[Geometry].unserializableCodec)

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

import com.azavea.stac4s.meta._
import com.azavea.stac4s.testing.JvmInstances._
import com.azavea.stac4s.types._

import geotrellis.vector.Geometry
import io.circe.testing.{ArbitraryInstances, CodecTests}
import org.scalatest.funsuite.AnyFunSuite
import org.scalatest.matchers.must.Matchers
import org.scalatestplus.scalacheck.Checkers
import org.typelevel.discipline.scalatest.FunSuiteDiscipline

import java.time.Instant

class JvmSerDeSpec extends AnyFunSuite with FunSuiteDiscipline with Checkers with Matchers with ArbitraryInstances {
checkAll("Codec.ItemCollection", CodecTests[ItemCollection].unserializableCodec)
checkAll("Codec.StacItem", CodecTests[StacItem].unserializableCodec)
checkAll("Codec.Geometry", CodecTests[Geometry].unserializableCodec)
checkAll("Codec.Instant", CodecTests[Instant].unserializableCodec)
checkAll("Codec.StacCollection", CodecTests[StacCollection].unserializableCodec)
checkAll("Codec.StacExtent", CodecTests[StacExtent].unserializableCodec)
checkAll("Codec.TemporalExtent", CodecTests[TemporalExtent].unserializableCodec)

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

import com.azavea.stac4s.syntax._
import com.azavea.stac4s.extensions._
import com.azavea.stac4s.extensions.asset._
import com.azavea.stac4s.extensions.eo._
import com.azavea.stac4s.extensions.asset.AssetCollectionExtension
import com.azavea.stac4s.extensions.label._
import com.azavea.stac4s.testing._
import com.azavea.stac4s.syntax._
import com.azavea.stac4s.testing.JvmInstances._
import com.azavea.stac4s.testing.TestInstances._

import cats.syntax.validated._
import io.circe.syntax._
import org.scalatest.funsuite.AnyFunSuite
import org.scalatest.matchers.should.Matchers
import org.scalatestplus.scalacheck.Checkers

class SyntaxSpec extends AnyFunSuite with Checkers with Matchers {
test("item syntax results in the same values as typeclass summoner to extend") {
check { (item: StacItem, labelExtension: LabelItemExtension) =>
item.addExtensionFields(labelExtension) == ItemExtension[LabelItemExtension]
.addExtensionFields(item, labelExtension)
}
}

test("item syntax results in the same values as typeclass summoner to parse") {
check { (item: StacItem, labelExtension: LabelItemExtension) =>
item.addExtensionFields(labelExtension).getExtensionFields[LabelItemExtension] ==
labelExtension.valid
}
}
class JvmSyntaxSpec extends AnyFunSuite with Checkers with Matchers {

test("collection syntax results in the same values as typeclass summoner to extend") {
check { (collection: StacCollection, assetExtension: AssetCollectionExtension) =>
Expand All @@ -46,29 +34,17 @@ class SyntaxSpec extends AnyFunSuite with Checkers with Matchers {
}
}

test("link syntax results in the same values as typeclass summoner to extend") {
check { (stacLink: StacLink, labelLinkExtension: LabelLinkExtension) =>
stacLink.addExtensionFields(labelLinkExtension) == LinkExtension[LabelLinkExtension]
.addExtensionFields(stacLink, labelLinkExtension)
}
}

test("link syntax results in the same values as typeclass summoner to parse") {
check { (stacLink: StacLink, labelLinkExtension: LabelLinkExtension) =>
stacLink.addExtensionFields(labelLinkExtension).getExtensionFields[LabelLinkExtension] == labelLinkExtension.valid
}
}

test("asset syntax results in the same values as typeclass summoner to extend") {
check { (stacItemAsset: StacItemAsset, eoAssetExtension: EOAssetExtension) =>
stacItemAsset.addExtensionFields(eoAssetExtension) == ItemAssetExtension[EOAssetExtension]
.addExtensionFields(stacItemAsset, eoAssetExtension)
test("item syntax results in the same values as typeclass summoner to extend") {
check { (item: StacItem, labelExtension: LabelItemExtension) =>
item.addExtensionFields(labelExtension) == ItemExtension[LabelItemExtension]
.addExtensionFields(item, labelExtension)
}
}

test("asset syntax results in the same values as typeclass summoner to parse") {
check { (stacItemAsset: StacItemAsset, eoAssetExtension: EOAssetExtension) =>
stacItemAsset.addExtensionFields(eoAssetExtension).getExtensionFields[EOAssetExtension] == eoAssetExtension.valid
test("item syntax results in the same values as typeclass summoner to parse") {
check { (item: StacItem, labelExtension: LabelItemExtension) =>
item.addExtensionFields(labelExtension).getExtensionFields[LabelItemExtension] ==
labelExtension.valid
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,39 +4,32 @@ import com.azavea.stac4s.extensions.asset._
import com.azavea.stac4s.extensions.eo._
import com.azavea.stac4s.extensions.label._
import com.azavea.stac4s.extensions.layer._
import com.azavea.stac4s.meta._
import com.azavea.stac4s.testing._
import geotrellis.vector.Geometry
import io.circe.syntax._
import com.azavea.stac4s.meta.ForeignImplicits._
import com.azavea.stac4s.testing.TestInstances._

import io.circe.parser._
import io.circe.syntax._
import io.circe.testing.{ArbitraryInstances, CodecTests}
import java.time.{Instant, OffsetDateTime}

import org.scalatest.Assertion
import org.scalatest.funsuite.AnyFunSuite
import org.scalatest.matchers.should.Matchers
import org.scalatestplus.scalacheck.Checkers
import org.typelevel.discipline.scalatest.FunSuiteDiscipline

import java.time.{Instant, OffsetDateTime}

class SerDeSpec extends AnyFunSuite with FunSuiteDiscipline with Checkers with Matchers with ArbitraryInstances {

// core
checkAll("Codec.Bbox", CodecTests[Bbox].unserializableCodec)
checkAll("Codec.Geometry", CodecTests[Geometry].unserializableCodec)
checkAll("Codec.Instant", CodecTests[Instant].unserializableCodec)
checkAll("Codec.ItemCollection", CodecTests[ItemCollection].unserializableCodec)
checkAll("Codec.SPDX", CodecTests[SPDX].unserializableCodec)
checkAll("Codec.StacAssetRole", CodecTests[StacAssetRole].unserializableCodec)
checkAll("Codec.StacCatalog", CodecTests[StacCatalog].unserializableCodec)
checkAll("Codec.StacCollection", CodecTests[StacCollection].unserializableCodec)
checkAll("Codec.StacCollectionAsset", CodecTests[StacCollectionAsset].unserializableCodec)
checkAll("Codec.StacExtent", CodecTests[StacExtent].unserializableCodec)
checkAll("Codec.StacItem", CodecTests[StacItem].unserializableCodec)
checkAll("Codec.StacItemAsset", CodecTests[StacItemAsset].unserializableCodec)
checkAll("Codec.StacLinkType", CodecTests[StacLinkType].unserializableCodec)
checkAll("Codec.StacMediaType", CodecTests[StacMediaType].unserializableCodec)
checkAll("Codec.StacProviderRole", CodecTests[StacProviderRole].unserializableCodec)
checkAll("Codec.TemporalExtent", CodecTests[TemporalExtent].unserializableCodec)
checkAll("Codec.ThreeDimBbox", CodecTests[ThreeDimBbox].unserializableCodec)
checkAll("Codec.TwoDimBbox", CodecTests[TwoDimBbox].unserializableCodec)

Expand Down
Loading

0 comments on commit e3421d9

Please sign in to comment.