diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1989a99 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +.idea +target +log \ No newline at end of file diff --git a/.scalafmt.conf b/.scalafmt.conf new file mode 100644 index 0000000..2532d33 --- /dev/null +++ b/.scalafmt.conf @@ -0,0 +1,64 @@ +docstrings = JavaDoc + +maxColumn = 120 + +rewriteTokens { + "=>": "⇒" + "<-": "←" +} + +align = none +align { + openParenCallSite = false + openParenDefnSite = false + tokens = [ + "%", "%%", "%%%", ":=", "~=" + ] +} + +assumeStandardLibraryStripMargin = true +includeCurlyBraceInSelectChains = false + +continuationIndent { + callSite = 2 + defnSite = 2 + extendSite = 4 +} + +danglingParentheses = true + +newlines { + alwaysBeforeTopLevelStatements = true + sometimesBeforeColonInMethodReturnType = true + penalizeSingleSelectMultiArgList = false + alwaysBeforeElseAfterCurlyIf = false + neverInResultType = false +} + +spaces { + afterKeywordBeforeParen = true +} + +binPack { + parentConstructors = true + literalArgumentLists = true +} + +optIn { + breaksInsideChains = false + breakChainOnFirstMethodDot = true + configStyleArguments = true +} + +runner { + optimizer { + forceConfigStyleOnOffset = 150 + forceConfigStyleMinArgCount = 2 + } +} + +rewrite { + rules = [ + SortImports + ] +} diff --git a/build.sbt b/build.sbt new file mode 100644 index 0000000..c7218fb --- /dev/null +++ b/build.sbt @@ -0,0 +1,145 @@ +import de.heikoseeberger.sbtheader.License +import org.scalajs.sbtplugin.ScalaJSPlugin.autoImport._ +import sbtcrossproject.crossProject + +name := "codec" + +scalacOptions in Compile ++= Seq("-Ypartial-unification", "-Xdisable-assertions") + +javaOptions in Test ++= Seq("-ea") + +val scalaV = scalaVersion := "2.12.5" + +val commons = Seq( + scalaV, + version := "0.1", + fork in Test := true, + parallelExecution in Test := false, + organizationName := "Fluence Labs Limited", + organizationHomepage := Some(new URL("https://fluence.ai")), + startYear := Some(2017), + licenses += ("AGPL-3.0", new URL("http://www.gnu.org/licenses/agpl-3.0.en.html")), + headerLicense := Some(License.AGPLv3("2017", organizationName.value)) +) + +commons + +val kindProjector = addCompilerPlugin("org.spire-math" %% "kind-projector" % "0.9.6") + +val Cats1V = "1.1.0" +val ScodecBitsV = "1.1.5" +val CirceV = "0.9.3" +val ShapelessV = "2.3.+" + +val chill = "com.twitter" %% "chill" % "0.9.2" + +val ScalatestV = "3.0.+" +val ScalacheckV = "1.13.4" + +val protobuf = Seq( + PB.targets in Compile := Seq( + scalapb.gen() -> (sourceManaged in Compile).value + ), + libraryDependencies ++= Seq( + "com.thesamet.scalapb" %% "scalapb-runtime" % scalapb.compiler.Version.scalapbVersion % "protobuf" + ) +) + +enablePlugins(AutomateHeaderPlugin) + +lazy val `codec-core` = crossProject(JVMPlatform, JSPlatform) + .withoutSuffixFor(JVMPlatform) + .crossType(FluenceCrossType) + .in(file("core")) + .settings( + commons, + kindProjector, + libraryDependencies ++= Seq( + "org.typelevel" %%% "cats-core" % Cats1V, + "org.typelevel" %%% "cats-laws" % Cats1V % Test, + "org.typelevel" %%% "cats-testkit" % Cats1V % Test, + "com.github.alexarchambault" %%% "scalacheck-shapeless_1.13" % "1.1.8" % Test, + "org.scalacheck" %%% "scalacheck" % ScalacheckV % Test, + "org.scalatest" %%% "scalatest" % ScalatestV % Test + ) + ) + .jsSettings( + fork in Test := false + ) + .enablePlugins(AutomateHeaderPlugin) + +lazy val `codec-core-jvm` = `codec-core`.jvm +lazy val `codec-core-js` = `codec-core`.js + +lazy val `codec-bits` = crossProject(JVMPlatform, JSPlatform) + .withoutSuffixFor(JVMPlatform) + .crossType(FluenceCrossType) + .in(file("bits")) + .settings( + commons, + libraryDependencies ++= Seq( + "org.scodec" %%% "scodec-bits" % ScodecBitsV, + "org.scalacheck" %%% "scalacheck" % ScalacheckV % Test, + "org.scalatest" %%% "scalatest" % ScalatestV % Test + ) + ) + .jsSettings( + fork in Test := false + ) + .enablePlugins(AutomateHeaderPlugin) + .dependsOn(`codec-core`) + +lazy val `codec-bits-js` = `codec-bits`.js +lazy val `codec-bits-jvm` = `codec-bits`.jvm + +lazy val `codec-circe` = crossProject(JVMPlatform, JSPlatform) + .withoutSuffixFor(JVMPlatform) + .crossType(FluenceCrossType) + .in(file("circe")) + .settings( + commons, + libraryDependencies ++= Seq( + "io.circe" %%% "circe-core" % CirceV, + "io.circe" %%% "circe-parser" % CirceV, + "org.scalatest" %%% "scalatest" % ScalatestV % Test + ) + ) + .jsSettings( + fork in Test := false + ) + .enablePlugins(AutomateHeaderPlugin) + .dependsOn(`codec-core`) + +lazy val `codec-circe-js` = `codec-circe`.js +lazy val `codec-circe-jvm` = `codec-circe`.jvm + +lazy val `codec-kryo` = project + .in(file("kryo")) + .settings( + commons, + libraryDependencies ++= Seq( + chill, + "com.chuusai" %% "shapeless" % ShapelessV, + "org.scalatest" %% "scalatest" % ScalatestV % Test + ) + ) + .dependsOn(`codec-core-jvm`) + +lazy val `codec-protobuf` = crossProject(JVMPlatform, JSPlatform) + .withoutSuffixFor(JVMPlatform) + .crossType(FluenceCrossType) + .in(file("codec/protobuf")) + .settings( + commons, + protobuf + ) + .jsSettings( + fork in Test := false, + scalaJSModuleKind := ModuleKind.CommonJSModule + ) + .enablePlugins(AutomateHeaderPlugin) + .dependsOn(`codec-core`) + +lazy val `codec-protobuf-jvm` = `codec-protobuf`.jvm +lazy val `codec-protobuf-js` = `codec-protobuf`.js + diff --git a/kryo/build.sbt b/kryo/build.sbt deleted file mode 100644 index 4bb5a33..0000000 --- a/kryo/build.sbt +++ /dev/null @@ -1,11 +0,0 @@ -import SbtCommons._ - -enablePlugins(AutomateHeaderPlugin) - -commons - -libraryDependencies ++= Seq( - chill, - shapeless, - scalatest -) \ No newline at end of file diff --git a/project/FluenceCrossType.scala b/project/FluenceCrossType.scala new file mode 100644 index 0000000..74e64e6 --- /dev/null +++ b/project/FluenceCrossType.scala @@ -0,0 +1,29 @@ +import sbt._ +import sbtcrossproject.CrossPlugin.autoImport._ + +import scalajscrossproject.ScalaJSCrossPlugin.autoImport._ + +/** + * cross types https://github.com/portable-scala/sbt-crossproject + * http://xuwei-k.github.io/slides/scala-js-matsuri/#21 + * avoid move files + */ +object FluenceCrossType extends sbtcrossproject.CrossType { + override def projectDir(crossBase: File, projectType: String) = + crossBase / projectType + + override def projectDir(crossBase: File, projectType: sbtcrossproject.Platform) = { + val dir = projectType match { + case JVMPlatform ⇒ "jvm" + case JSPlatform ⇒ "js" + } + crossBase / dir + } + + def shared(projectBase: File, conf: String) = + projectBase.getParentFile / "src" / conf / "scala" + + override def sharedSrcDir(projectBase: File, conf: String) = + Some(shared(projectBase, conf)) +} + diff --git a/project/build.properties b/project/build.properties new file mode 100644 index 0000000..263c970 --- /dev/null +++ b/project/build.properties @@ -0,0 +1 @@ +sbt.version = 1.1.2 diff --git a/project/plugins.sbt b/project/plugins.sbt new file mode 100644 index 0000000..e2b0d16 --- /dev/null +++ b/project/plugins.sbt @@ -0,0 +1,20 @@ +addSbtPlugin("com.geirsson" % "sbt-scalafmt" % "1.4.0") + +addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % "1.3.2") + +addSbtPlugin("de.heikoseeberger" % "sbt-header" % "4.1.0") + +addSbtPlugin("com.thesamet" % "sbt-protoc" % "0.99.18") + +addSbtPlugin("org.scala-js" % "sbt-scalajs" % "0.6.22") +addSbtPlugin("org.portable-scala" % "sbt-crossproject" % "0.3.1") +addSbtPlugin("org.portable-scala" % "sbt-scalajs-crossproject" % "0.3.1") + +addSbtPlugin("ch.epfl.scala" % "sbt-scalajs-bundler" % "0.10.0") + +addSbtPlugin("net.virtual-void" % "sbt-dependency-graph" % "0.9.0") + +addSbtPlugin("com.lihaoyi" % "workbench" % "0.4.0") + +libraryDependencies += "com.thesamet.scalapb" %% "compilerplugin" % "0.7.1" +