From 66c3e7e4c9f1fa80fbd977f43f7ecbb7b527ebea Mon Sep 17 00:00:00 2001 From: Derek Morr Date: Sun, 29 Oct 2017 09:11:04 -0400 Subject: [PATCH 1/2] pull version into its own file --- build.sbt | 1 - version.sbt | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 version.sbt diff --git a/build.sbt b/build.sbt index 815fae4..7d80833 100644 --- a/build.sbt +++ b/build.sbt @@ -54,7 +54,6 @@ lazy val pureCSV = crossProject.crossType(CrossType.Full).in(new File(".")). settings(publishSettings). settings( name := "purecsv", - version := "0.1.1", javacOptions ++= Seq("-source", "1.8", "-target", "1.8"), scalacOptions ++= Seq("-feature", "-deprecation"), libraryDependencies ++= Seq( diff --git a/version.sbt b/version.sbt new file mode 100644 index 0000000..e4149a8 --- /dev/null +++ b/version.sbt @@ -0,0 +1 @@ +version in ThisBuild := "0.1.1" From be53829587424fedf63c83c261b8dc37366b808f Mon Sep 17 00:00:00 2001 From: Derek Morr Date: Sun, 29 Oct 2017 14:58:32 -0400 Subject: [PATCH 2/2] move purecsv into it's own dir; add refined module --- build.sbt | 29 +++++++++++---- .../purecsv/module/refined/safe/package.scala | 35 +++++++++++++++++++ .../module/refined/unsafe/package.scala | 29 +++++++++++++++ .../refined/safe/RefinedSafeSuite.scala | 24 +++++++++++++ .../refined/unsafe/RefinedUnsafeSuite.scala | 25 +++++++++++++ .../scala/purecsv/csviterable/package.scala | 0 .../purecsv/safe/converter/Converter.scala | 0 .../defaults/rawfields/package.scala | 0 .../converter/defaults/string/package.scala | 0 .../src/main/scala/purecsv/safe/package.scala | 0 .../scala/purecsv/safe/tryutil/TryUtil.scala | 0 .../scala/purecsv/unsafe/RecordSplitter.scala | 0 .../purecsv/unsafe/RecordSplitterImpl.scala | 0 .../purecsv/unsafe/converter/Converter.scala | 0 .../defaults/rawfields/package.scala | 0 .../converter/defaults/string/package.scala | 0 .../main/scala/purecsv/unsafe/package.scala | 0 .../scala/purecsv/RecordSplitterSuite.scala | 0 .../purecsv/csviterable/CSVRecordTest.scala | 0 .../src/test/scala/purecsv/package.scala | 0 .../scala/purecsv/safe/TryUtilSuite.scala | 0 .../safe/converter/ConverterSuite.scala | 0 .../safe/customerDelimiterSafeSuite.scala | 0 .../test/scala/purecsv/safe/safeSuite.scala | 0 .../unsafe/converter/ConverterSuite.scala | 0 .../unsafe/customerDelimiterUnsafeSuite.scala | 0 .../scala/purecsv/unsafe/unsafeSuite.scala | 0 27 files changed, 135 insertions(+), 7 deletions(-) create mode 100644 modules/refined/shared/src/main/scala/purecsv/module/refined/safe/package.scala create mode 100644 modules/refined/shared/src/main/scala/purecsv/module/refined/unsafe/package.scala create mode 100644 modules/refined/shared/src/test/scala/purecsv/modules/refined/safe/RefinedSafeSuite.scala create mode 100644 modules/refined/shared/src/test/scala/purecsv/modules/refined/unsafe/RefinedUnsafeSuite.scala rename {shared => purecsv/shared}/src/main/scala/purecsv/csviterable/package.scala (100%) rename {shared => purecsv/shared}/src/main/scala/purecsv/safe/converter/Converter.scala (100%) rename {shared => purecsv/shared}/src/main/scala/purecsv/safe/converter/defaults/rawfields/package.scala (100%) rename {shared => purecsv/shared}/src/main/scala/purecsv/safe/converter/defaults/string/package.scala (100%) rename {shared => purecsv/shared}/src/main/scala/purecsv/safe/package.scala (100%) rename {shared => purecsv/shared}/src/main/scala/purecsv/safe/tryutil/TryUtil.scala (100%) rename {shared => purecsv/shared}/src/main/scala/purecsv/unsafe/RecordSplitter.scala (100%) rename {shared => purecsv/shared}/src/main/scala/purecsv/unsafe/RecordSplitterImpl.scala (100%) rename {shared => purecsv/shared}/src/main/scala/purecsv/unsafe/converter/Converter.scala (100%) rename {shared => purecsv/shared}/src/main/scala/purecsv/unsafe/converter/defaults/rawfields/package.scala (100%) rename {shared => purecsv/shared}/src/main/scala/purecsv/unsafe/converter/defaults/string/package.scala (100%) rename {shared => purecsv/shared}/src/main/scala/purecsv/unsafe/package.scala (100%) rename {shared => purecsv/shared}/src/test/scala/purecsv/RecordSplitterSuite.scala (100%) rename {shared => purecsv/shared}/src/test/scala/purecsv/csviterable/CSVRecordTest.scala (100%) rename {shared => purecsv/shared}/src/test/scala/purecsv/package.scala (100%) rename {shared => purecsv/shared}/src/test/scala/purecsv/safe/TryUtilSuite.scala (100%) rename {shared => purecsv/shared}/src/test/scala/purecsv/safe/converter/ConverterSuite.scala (100%) rename {shared => purecsv/shared}/src/test/scala/purecsv/safe/customerDelimiterSafeSuite.scala (100%) rename {shared => purecsv/shared}/src/test/scala/purecsv/safe/safeSuite.scala (100%) rename {shared => purecsv/shared}/src/test/scala/purecsv/unsafe/converter/ConverterSuite.scala (100%) rename {shared => purecsv/shared}/src/test/scala/purecsv/unsafe/customerDelimiterUnsafeSuite.scala (100%) rename {shared => purecsv/shared}/src/test/scala/purecsv/unsafe/unsafeSuite.scala (100%) diff --git a/build.sbt b/build.sbt index 7d80833..a1bf147 100644 --- a/build.sbt +++ b/build.sbt @@ -3,7 +3,9 @@ import sbt.Keys._ lazy val buildSettings = Seq( organization := "com.github.melrief", scalaVersion := "2.12.1", - crossScalaVersions := Seq("2.10.5", "2.11.8", "2.12.1") + crossScalaVersions := Seq("2.10.5", "2.11.8", "2.12.1"), + javacOptions ++= Seq("-source", "1.8", "-target", "1.8"), + scalacOptions ++= Seq("-feature", "-deprecation") ) lazy val publishSettings = Seq( @@ -44,18 +46,15 @@ lazy val noPublishSettings = Seq( ) lazy val root = project.in(file(".")). - aggregate(pureCSVJVM, pureCSVJS). + aggregate(pureCSVJVM, pureCSVJS, refinedJVM, refinedJS). settings(buildSettings). - settings(publishSettings). - settings(noPublishSettings) + settings(publishSettings) -lazy val pureCSV = crossProject.crossType(CrossType.Full).in(new File(".")). +lazy val pureCSV = crossProject.crossType(CrossType.Full).in(file("purecsv")). settings(buildSettings). settings(publishSettings). settings( name := "purecsv", - javacOptions ++= Seq("-source", "1.8", "-target", "1.8"), - scalacOptions ++= Seq("-feature", "-deprecation"), libraryDependencies ++= Seq( "com.chuusai" %% "shapeless" % "2.3.2", compilerPlugin("org.scalamacros" % "paradise" % "2.1.0" cross CrossVersion.full), @@ -75,3 +74,19 @@ lazy val pureCSV = crossProject.crossType(CrossType.Full).in(new File(".")). lazy val pureCSVJVM = pureCSV.jvm lazy val pureCSVJS = pureCSV.js + +lazy val refined = (crossProject.crossType(CrossType.Full) in file("modules/refined")). + dependsOn(pureCSV). + dependsOn(pureCSV % "test->test"). + settings(buildSettings). + settings(publishSettings). + settings( + name := "purecsv-refined", + libraryDependencies ++= Seq( + "eu.timepit" %% "refined" % "0.8.4") + ). + jvmSettings(). + jsSettings() + +lazy val refinedJVM = refined.jvm +lazy val refinedJS = refined.js diff --git a/modules/refined/shared/src/main/scala/purecsv/module/refined/safe/package.scala b/modules/refined/shared/src/main/scala/purecsv/module/refined/safe/package.scala new file mode 100644 index 0000000..398720c --- /dev/null +++ b/modules/refined/shared/src/main/scala/purecsv/module/refined/safe/package.scala @@ -0,0 +1,35 @@ +package purecsv.module.refined + +import scala.language.higherKinds +import scala.util.{Failure, Success, Try} + +import eu.timepit.refined.api.{RefType, Validate} + +import purecsv.safe.converter.StringConverter + +/** + * StringConverter instance for refined types + */ +package object safe { + + implicit def refinedConverter[R[_, _], T, P](implicit + baseConverter: StringConverter[T], + reftype: RefType[R], + validate: Validate[T, P]) = new StringConverter[R[T, P]] { + + override def tryFrom(str: String): Try[R[T, P]] = { + baseConverter.tryFrom(str).flatMap { t => + reftype.refine[P](t) match { + case Left(errors) => Failure(new IllegalArgumentException(errors)) + case Right(refinedValue) => Success(refinedValue) + } + } + } + + override def to(value: R[T, P]): String = { + baseConverter.to(reftype.unwrap(value)) + } + + } + +} diff --git a/modules/refined/shared/src/main/scala/purecsv/module/refined/unsafe/package.scala b/modules/refined/shared/src/main/scala/purecsv/module/refined/unsafe/package.scala new file mode 100644 index 0000000..e8be592 --- /dev/null +++ b/modules/refined/shared/src/main/scala/purecsv/module/refined/unsafe/package.scala @@ -0,0 +1,29 @@ +package purecsv.module.refined + +import scala.language.higherKinds + +import eu.timepit.refined.api.{RefType, Validate} +import purecsv.unsafe.converter.StringConverter + +package object unsafe { + + implicit def refinedConverter[R[_, _], T, P](implicit + baseConverter: StringConverter[T], + reftype: RefType[R], + validate: Validate[T, P]) = new StringConverter[R[T, P]] { + + override def from(str: String): R[T, P] = { + val baseValue = baseConverter.from(str) + reftype.refine[P](baseValue) match { + case Left(errors) => throw new IllegalArgumentException(errors) + case Right(refinedValue) => refinedValue + } + } + + override def to(value: R[T, P]): String = { + baseConverter.to(reftype.unwrap(value)) + } + + } + +} diff --git a/modules/refined/shared/src/test/scala/purecsv/modules/refined/safe/RefinedSafeSuite.scala b/modules/refined/shared/src/test/scala/purecsv/modules/refined/safe/RefinedSafeSuite.scala new file mode 100644 index 0000000..5eddd9e --- /dev/null +++ b/modules/refined/shared/src/test/scala/purecsv/modules/refined/safe/RefinedSafeSuite.scala @@ -0,0 +1,24 @@ +package purecsv.modules.refined.safe + +import scala.util.Success + +import eu.timepit.refined.auto._ +import eu.timepit.refined.types.numeric.PosInt +import org.scalatest.{FunSuite, Matchers} +import purecsv.safe._ +import purecsv.safe.converter.StringConverter +import purecsv.module.refined.safe._ + +class RefinedSafeSuite extends FunSuite with Matchers { + + test("Reading a refined type works") { + val posOne: PosInt = 1 + StringConverter[PosInt].tryFrom("1") should be (Success(posOne)) + StringConverter[PosInt].tryFrom("-4") should be a 'failure + } + + test("Writing a refined type works") { + val posOne: PosInt = 1 + StringConverter[PosInt].to(posOne) should be ("1") + } +} diff --git a/modules/refined/shared/src/test/scala/purecsv/modules/refined/unsafe/RefinedUnsafeSuite.scala b/modules/refined/shared/src/test/scala/purecsv/modules/refined/unsafe/RefinedUnsafeSuite.scala new file mode 100644 index 0000000..0d7f13a --- /dev/null +++ b/modules/refined/shared/src/test/scala/purecsv/modules/refined/unsafe/RefinedUnsafeSuite.scala @@ -0,0 +1,25 @@ +package purecsv.modules.refined.unsafe + +import eu.timepit.refined.auto._ +import eu.timepit.refined.types.numeric.PosInt +import org.scalatest.{FunSuite, Matchers} +import purecsv.unsafe._ +import purecsv.unsafe.converter.StringConverter +import purecsv.module.refined.unsafe._ + +class RefinedUnsafeSuite extends FunSuite with Matchers { + + test("Reading a refined type works") { + val posOne: PosInt = 1 + StringConverter[PosInt].from("1") should be (posOne) + + an [IllegalArgumentException] should be thrownBy + StringConverter[PosInt].from("-4") + } + + test("Writing a refined type works") { + val posOne: PosInt = 1 + StringConverter[PosInt].to(posOne) should be ("1") + } + +} diff --git a/shared/src/main/scala/purecsv/csviterable/package.scala b/purecsv/shared/src/main/scala/purecsv/csviterable/package.scala similarity index 100% rename from shared/src/main/scala/purecsv/csviterable/package.scala rename to purecsv/shared/src/main/scala/purecsv/csviterable/package.scala diff --git a/shared/src/main/scala/purecsv/safe/converter/Converter.scala b/purecsv/shared/src/main/scala/purecsv/safe/converter/Converter.scala similarity index 100% rename from shared/src/main/scala/purecsv/safe/converter/Converter.scala rename to purecsv/shared/src/main/scala/purecsv/safe/converter/Converter.scala diff --git a/shared/src/main/scala/purecsv/safe/converter/defaults/rawfields/package.scala b/purecsv/shared/src/main/scala/purecsv/safe/converter/defaults/rawfields/package.scala similarity index 100% rename from shared/src/main/scala/purecsv/safe/converter/defaults/rawfields/package.scala rename to purecsv/shared/src/main/scala/purecsv/safe/converter/defaults/rawfields/package.scala diff --git a/shared/src/main/scala/purecsv/safe/converter/defaults/string/package.scala b/purecsv/shared/src/main/scala/purecsv/safe/converter/defaults/string/package.scala similarity index 100% rename from shared/src/main/scala/purecsv/safe/converter/defaults/string/package.scala rename to purecsv/shared/src/main/scala/purecsv/safe/converter/defaults/string/package.scala diff --git a/shared/src/main/scala/purecsv/safe/package.scala b/purecsv/shared/src/main/scala/purecsv/safe/package.scala similarity index 100% rename from shared/src/main/scala/purecsv/safe/package.scala rename to purecsv/shared/src/main/scala/purecsv/safe/package.scala diff --git a/shared/src/main/scala/purecsv/safe/tryutil/TryUtil.scala b/purecsv/shared/src/main/scala/purecsv/safe/tryutil/TryUtil.scala similarity index 100% rename from shared/src/main/scala/purecsv/safe/tryutil/TryUtil.scala rename to purecsv/shared/src/main/scala/purecsv/safe/tryutil/TryUtil.scala diff --git a/shared/src/main/scala/purecsv/unsafe/RecordSplitter.scala b/purecsv/shared/src/main/scala/purecsv/unsafe/RecordSplitter.scala similarity index 100% rename from shared/src/main/scala/purecsv/unsafe/RecordSplitter.scala rename to purecsv/shared/src/main/scala/purecsv/unsafe/RecordSplitter.scala diff --git a/shared/src/main/scala/purecsv/unsafe/RecordSplitterImpl.scala b/purecsv/shared/src/main/scala/purecsv/unsafe/RecordSplitterImpl.scala similarity index 100% rename from shared/src/main/scala/purecsv/unsafe/RecordSplitterImpl.scala rename to purecsv/shared/src/main/scala/purecsv/unsafe/RecordSplitterImpl.scala diff --git a/shared/src/main/scala/purecsv/unsafe/converter/Converter.scala b/purecsv/shared/src/main/scala/purecsv/unsafe/converter/Converter.scala similarity index 100% rename from shared/src/main/scala/purecsv/unsafe/converter/Converter.scala rename to purecsv/shared/src/main/scala/purecsv/unsafe/converter/Converter.scala diff --git a/shared/src/main/scala/purecsv/unsafe/converter/defaults/rawfields/package.scala b/purecsv/shared/src/main/scala/purecsv/unsafe/converter/defaults/rawfields/package.scala similarity index 100% rename from shared/src/main/scala/purecsv/unsafe/converter/defaults/rawfields/package.scala rename to purecsv/shared/src/main/scala/purecsv/unsafe/converter/defaults/rawfields/package.scala diff --git a/shared/src/main/scala/purecsv/unsafe/converter/defaults/string/package.scala b/purecsv/shared/src/main/scala/purecsv/unsafe/converter/defaults/string/package.scala similarity index 100% rename from shared/src/main/scala/purecsv/unsafe/converter/defaults/string/package.scala rename to purecsv/shared/src/main/scala/purecsv/unsafe/converter/defaults/string/package.scala diff --git a/shared/src/main/scala/purecsv/unsafe/package.scala b/purecsv/shared/src/main/scala/purecsv/unsafe/package.scala similarity index 100% rename from shared/src/main/scala/purecsv/unsafe/package.scala rename to purecsv/shared/src/main/scala/purecsv/unsafe/package.scala diff --git a/shared/src/test/scala/purecsv/RecordSplitterSuite.scala b/purecsv/shared/src/test/scala/purecsv/RecordSplitterSuite.scala similarity index 100% rename from shared/src/test/scala/purecsv/RecordSplitterSuite.scala rename to purecsv/shared/src/test/scala/purecsv/RecordSplitterSuite.scala diff --git a/shared/src/test/scala/purecsv/csviterable/CSVRecordTest.scala b/purecsv/shared/src/test/scala/purecsv/csviterable/CSVRecordTest.scala similarity index 100% rename from shared/src/test/scala/purecsv/csviterable/CSVRecordTest.scala rename to purecsv/shared/src/test/scala/purecsv/csviterable/CSVRecordTest.scala diff --git a/shared/src/test/scala/purecsv/package.scala b/purecsv/shared/src/test/scala/purecsv/package.scala similarity index 100% rename from shared/src/test/scala/purecsv/package.scala rename to purecsv/shared/src/test/scala/purecsv/package.scala diff --git a/shared/src/test/scala/purecsv/safe/TryUtilSuite.scala b/purecsv/shared/src/test/scala/purecsv/safe/TryUtilSuite.scala similarity index 100% rename from shared/src/test/scala/purecsv/safe/TryUtilSuite.scala rename to purecsv/shared/src/test/scala/purecsv/safe/TryUtilSuite.scala diff --git a/shared/src/test/scala/purecsv/safe/converter/ConverterSuite.scala b/purecsv/shared/src/test/scala/purecsv/safe/converter/ConverterSuite.scala similarity index 100% rename from shared/src/test/scala/purecsv/safe/converter/ConverterSuite.scala rename to purecsv/shared/src/test/scala/purecsv/safe/converter/ConverterSuite.scala diff --git a/shared/src/test/scala/purecsv/safe/customerDelimiterSafeSuite.scala b/purecsv/shared/src/test/scala/purecsv/safe/customerDelimiterSafeSuite.scala similarity index 100% rename from shared/src/test/scala/purecsv/safe/customerDelimiterSafeSuite.scala rename to purecsv/shared/src/test/scala/purecsv/safe/customerDelimiterSafeSuite.scala diff --git a/shared/src/test/scala/purecsv/safe/safeSuite.scala b/purecsv/shared/src/test/scala/purecsv/safe/safeSuite.scala similarity index 100% rename from shared/src/test/scala/purecsv/safe/safeSuite.scala rename to purecsv/shared/src/test/scala/purecsv/safe/safeSuite.scala diff --git a/shared/src/test/scala/purecsv/unsafe/converter/ConverterSuite.scala b/purecsv/shared/src/test/scala/purecsv/unsafe/converter/ConverterSuite.scala similarity index 100% rename from shared/src/test/scala/purecsv/unsafe/converter/ConverterSuite.scala rename to purecsv/shared/src/test/scala/purecsv/unsafe/converter/ConverterSuite.scala diff --git a/shared/src/test/scala/purecsv/unsafe/customerDelimiterUnsafeSuite.scala b/purecsv/shared/src/test/scala/purecsv/unsafe/customerDelimiterUnsafeSuite.scala similarity index 100% rename from shared/src/test/scala/purecsv/unsafe/customerDelimiterUnsafeSuite.scala rename to purecsv/shared/src/test/scala/purecsv/unsafe/customerDelimiterUnsafeSuite.scala diff --git a/shared/src/test/scala/purecsv/unsafe/unsafeSuite.scala b/purecsv/shared/src/test/scala/purecsv/unsafe/unsafeSuite.scala similarity index 100% rename from shared/src/test/scala/purecsv/unsafe/unsafeSuite.scala rename to purecsv/shared/src/test/scala/purecsv/unsafe/unsafeSuite.scala