Skip to content

Commit

Permalink
Test
Browse files Browse the repository at this point in the history
  • Loading branch information
jcazevedo committed Feb 17, 2021
1 parent 3a17599 commit 7390cde
Show file tree
Hide file tree
Showing 82 changed files with 1,958 additions and 1,620 deletions.
7 changes: 1 addition & 6 deletions .github/workflows/ci.yml
Expand Up @@ -24,12 +24,7 @@ jobs:
run: sbt "++${{ matrix.scala }} scalafmtCheckAll; scalafmtSbtCheck"

- name: Compile
run: >
if [[ "${{ matrix.scala }}" =~ ^2\..* ]]; then
sbt coverage "++${{ matrix.scala }} test";
else
sbt "++${{ matrix.scala }} test";
fi
run: sbt "++${{ matrix.scala }} clean; compile"

- name: Run tests
run: >
Expand Down
2 changes: 2 additions & 0 deletions .scalafmt.conf
Expand Up @@ -2,3 +2,5 @@ version = 2.7.5

align.preset = none
maxColumn = 120

docstrings.style = Asterisk
13 changes: 7 additions & 6 deletions core/src/main/scala-2.12-/pureconfig/FactoryCompat.scala
Expand Up @@ -3,12 +3,13 @@ package pureconfig
import scala.collection.generic.CanBuildFrom
import scala.collection.mutable

/** A compatibility layer for creating `CanBuildFrom`-like generic methods that work both on Scala 2.13 and pre-2.13
* versions.
*
* @tparam A the type of elements that get added to the builder
* @tparam C the type of collection that it produces
*/
/**
* A compatibility layer for creating `CanBuildFrom`-like generic methods that work both on Scala 2.13 and pre-2.13
* versions.
*
* @tparam A the type of elements that get added to the builder
* @tparam C the type of collection that it produces
*/
trait FactoryCompat[-A, +C] {
def newBuilder(): mutable.Builder[A, C]
}
Expand Down
49 changes: 29 additions & 20 deletions core/src/main/scala/pureconfig/BasicReaders.scala
Expand Up @@ -19,8 +19,9 @@ import pureconfig.error._

import scala.util.Try

/** Trait containing `ConfigReader` instances for primitive types.
*/
/**
* Trait containing `ConfigReader` instances for primitive types.
*/
trait PrimitiveReaders {

implicit val stringConfigReader: ConfigReader[String] = ConfigReader.fromCursor(_.asString)
Expand Down Expand Up @@ -61,8 +62,9 @@ trait PrimitiveReaders {
implicit val byteConfigReader: ConfigReader[Byte] = ConfigReader.fromCursor(_.asByte)
}

/** Trait containing `ConfigReader` instance for Java Enums.
*/
/**
* Trait containing `ConfigReader` instance for Java Enums.
*/
trait JavaEnumReader {

implicit def javaEnumReader[A <: java.lang.Enum[A]](implicit tag: ClassTag[A]): ConfigReader[A] =
Expand All @@ -72,8 +74,9 @@ trait JavaEnumReader {
}))
}

/** Trait containing `ConfigReader` instances for classes related to file system paths and URIs.
*/
/**
* Trait containing `ConfigReader` instances for classes related to file system paths and URIs.
*/
trait UriAndPathReaders {

implicit val urlConfigReader: ConfigReader[URL] = ConfigReader.fromNonEmptyString[URL](catchReadError(new URL(_)))
Expand All @@ -84,16 +87,18 @@ trait UriAndPathReaders {
implicit val uriConfigReader: ConfigReader[URI] = ConfigReader.fromString[URI](catchReadError(new URI(_)))
}

/** Trait containing `ConfigReader` instances for classes related to regular expressions.
*/
/**
* Trait containing `ConfigReader` instances for classes related to regular expressions.
*/
trait RegexReaders {

implicit val patternReader: ConfigReader[Pattern] = ConfigReader.fromString[Pattern](catchReadError(Pattern.compile))
implicit val regexReader: ConfigReader[Regex] = ConfigReader.fromString[Regex](catchReadError(new Regex(_)))
}

/** Trait containing `ConfigReader` instances for `java.time` classes.
*/
/**
* Trait containing `ConfigReader` instances for `java.time` classes.
*/
trait JavaTimeReaders {

implicit val instantConfigReader: ConfigReader[Instant] =
Expand All @@ -115,9 +120,10 @@ trait JavaTimeReaders {
ConfigReader.fromNonEmptyString[Year](catchReadError(Year.parse))
}

/** Trait containing `ConfigReader` instances for [[scala.concurrent.duration.Duration]] and
* [[scala.concurrent.duration.FiniteDuration]].
*/
/**
* Trait containing `ConfigReader` instances for [[scala.concurrent.duration.Duration]] and
* [[scala.concurrent.duration.FiniteDuration]].
*/
trait DurationReaders {

implicit val durationConfigReader: ConfigReader[Duration] =
Expand All @@ -141,8 +147,9 @@ trait DurationReaders {
}
}

/** Trait containing `ConfigReader` instances for Java and Scala arbitrary-precision numeric types.
*/
/**
* Trait containing `ConfigReader` instances for Java and Scala arbitrary-precision numeric types.
*/
trait NumericReaders {

implicit val javaBigIntegerReader: ConfigReader[BigInteger] =
Expand All @@ -158,8 +165,9 @@ trait NumericReaders {
ConfigReader.fromNonEmptyString[BigDecimal](catchReadError(BigDecimal(_)))
}

/** Trait containing `ConfigReader` instances for Typesafe config models.
*/
/**
* Trait containing `ConfigReader` instances for Typesafe config models.
*/
trait TypesafeConfigReaders {

implicit val configConfigReader: ConfigReader[Config] =
Expand Down Expand Up @@ -190,9 +198,10 @@ trait TypesafeConfigReaders {
}
}

/** Trait containing `ConfigReader` instances for primitive types and simple classes in Java and Scala standard
* libraries.
*/
/**
* Trait containing `ConfigReader` instances for primitive types and simple classes in Java and Scala standard
* libraries.
*/
trait BasicReaders
extends PrimitiveReaders
with JavaEnumReader
Expand Down
49 changes: 29 additions & 20 deletions core/src/main/scala/pureconfig/BasicWriters.scala
Expand Up @@ -15,8 +15,9 @@ import scala.util.matching.Regex

import com.typesafe.config._

/** Trait containing `ConfigWriter` instances for primitive types.
*/
/**
* Trait containing `ConfigWriter` instances for primitive types.
*/
trait PrimitiveWriters {

implicit val stringConfigWriter: ConfigWriter[String] = ConfigWriter.forPrimitive[String]
Expand All @@ -30,15 +31,17 @@ trait PrimitiveWriters {
implicit val byteConfigWriter: ConfigWriter[Byte] = ConfigWriter.forPrimitive[Byte]
}

/** Trait containing instance for `ConfigWriter` for Java Enum.
*/
/**
* Trait containing instance for `ConfigWriter` for Java Enum.
*/
trait JavaEnumWriter {

implicit def javaEnumWriter[A <: java.lang.Enum[A]]: ConfigWriter[A] = ConfigWriter.toDefaultString[A]
}

/** Trait containing `ConfigWriter` instances for classes related to file system paths and URIs.
*/
/**
* Trait containing `ConfigWriter` instances for classes related to file system paths and URIs.
*/
trait UriAndPathWriters {

implicit val urlConfigWriter: ConfigWriter[URL] = ConfigWriter.toDefaultString[URL]
Expand All @@ -48,17 +51,19 @@ trait UriAndPathWriters {
implicit val uriConfigWriter: ConfigWriter[URI] = ConfigWriter.toDefaultString[URI]
}

/** Trait containing `ConfigWriter` instances for classes related to regular expressions.
*/
/**
* Trait containing `ConfigWriter` instances for classes related to regular expressions.
*/
trait RegexWriters {

implicit val patternWriter: ConfigWriter[Pattern] = ConfigWriter.toString[Pattern](_.pattern)
implicit val regexWriter: ConfigWriter[Regex] =
ConfigWriter.toString[Regex](_.pattern.pattern) // Regex.regex isn't supported until 2.11
}

/** Trait containing `ConfigWriter` instances for `java.time` classes.
*/
/**
* Trait containing `ConfigWriter` instances for `java.time` classes.
*/
trait JavaTimeWriters {

implicit val instantConfigWriter: ConfigWriter[Instant] = ConfigWriter.toDefaultString[Instant]
Expand All @@ -74,9 +79,10 @@ trait JavaTimeWriters {
implicit val javaDurationConfigWriter: ConfigWriter[JavaDuration] = ConfigWriter.toDefaultString[JavaDuration]
}

/** Trait containing `ConfigWriter` instances for [[scala.concurrent.duration.Duration]] and
* [[scala.concurrent.duration.FiniteDuration]].
*/
/**
* Trait containing `ConfigWriter` instances for [[scala.concurrent.duration.Duration]] and
* [[scala.concurrent.duration.FiniteDuration]].
*/
trait DurationWriters {

implicit val durationConfigWriter: ConfigWriter[Duration] =
Expand All @@ -85,8 +91,9 @@ trait DurationWriters {
ConfigWriter.toString[FiniteDuration](DurationUtils.fromDuration)
}

/** Trait containing `ConfigWriter` instances for Java and Scala arbitrary-precision numeric types.
*/
/**
* Trait containing `ConfigWriter` instances for Java and Scala arbitrary-precision numeric types.
*/
trait NumericWriters {

implicit val javaBigDecimalWriter: ConfigWriter[JavaBigDecimal] = ConfigWriter.toDefaultString[JavaBigDecimal]
Expand All @@ -95,8 +102,9 @@ trait NumericWriters {
implicit val scalaBigIntWriter: ConfigWriter[BigInt] = ConfigWriter.toDefaultString[BigInt]
}

/** Trait containing `ConfigWriter` instances for Typesafe config models.
*/
/**
* Trait containing `ConfigWriter` instances for Typesafe config models.
*/
trait TypesafeConfigWriters {

implicit val configConfigWriter: ConfigWriter[Config] = new ConfigWriter[Config] {
Expand All @@ -120,9 +128,10 @@ trait TypesafeConfigWriters {
}
}

/** Trait containing `ConfigWriter` instances for primitive types and simple classes in Java and Scala standard
* libraries.
*/
/**
* Trait containing `ConfigWriter` instances for primitive types and simple classes in Java and Scala standard
* libraries.
*/
trait BasicWriters
extends PrimitiveWriters
with JavaEnumWriter
Expand Down
18 changes: 10 additions & 8 deletions core/src/main/scala/pureconfig/CollectionReaders.scala
Expand Up @@ -3,16 +3,18 @@ package pureconfig
import scala.language.higherKinds
import scala.reflect.ClassTag

/** A marker trait signaling that a `ConfigReader` accepts missing (undefined) values.
*
* The standard behavior of `ConfigReader`s that expect required keys in config objects is to return a `KeyNotFound`
* failure when one or more of them are missing. Mixing in this trait into the key's `ConfigReader` signals that if
* a value is missing for the key, the `ConfigReader` can be called with a cursor in the "undefined" state.
*/
/**
* A marker trait signaling that a `ConfigReader` accepts missing (undefined) values.
*
* The standard behavior of `ConfigReader`s that expect required keys in config objects is to return a `KeyNotFound`
* failure when one or more of them are missing. Mixing in this trait into the key's `ConfigReader` signals that if
* a value is missing for the key, the `ConfigReader` can be called with a cursor in the "undefined" state.
*/
trait ReadsMissingKeys { this: ConfigReader[_] => }

/** Trait containing `ConfigReader` instances for collection types.
*/
/**
* Trait containing `ConfigReader` instances for collection types.
*/
trait CollectionReaders {

implicit def optionReader[A](implicit conv: Derivation[ConfigReader[A]]): ConfigReader[Option[A]] =
Expand Down
16 changes: 9 additions & 7 deletions core/src/main/scala/pureconfig/CollectionWriters.scala
Expand Up @@ -5,17 +5,19 @@ import scala.language.higherKinds

import com.typesafe.config._

/** A trait signaling that a `ConfigWriter` can write missing (undefined) values.
*
* `ConfigWriter`s always produce a valid `ConfigValue` with their `to` method. This trait adds an extra `toOpt`
* method that parent writers can use in order to decide whether or not they should write a value using this writer.
*/
/**
* A trait signaling that a `ConfigWriter` can write missing (undefined) values.
*
* `ConfigWriter`s always produce a valid `ConfigValue` with their `to` method. This trait adds an extra `toOpt`
* method that parent writers can use in order to decide whether or not they should write a value using this writer.
*/
trait WritesMissingKeys[A] { this: ConfigWriter[A] =>
def toOpt(a: A): Option[ConfigValue]
}

/** Trait containing `ConfigWriter` instances for collection types.
*/
/**
* Trait containing `ConfigWriter` instances for collection types.
*/
trait CollectionWriters {

implicit def optionWriter[A](implicit conv: Derivation[ConfigWriter[A]]): ConfigWriter[Option[A]] =
Expand Down
51 changes: 28 additions & 23 deletions core/src/main/scala/pureconfig/ConfigConvert.scala
@@ -1,45 +1,50 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
/** @author Mario Pastorelli
*/
/**
* @author Mario Pastorelli
*/
package pureconfig

import scala.reflect.ClassTag
import scala.util.Try

import pureconfig.error.FailureReason

/** Trait for objects capable of reading and writing objects of a given type from and to `ConfigValues`.
*/
/**
* Trait for objects capable of reading and writing objects of a given type from and to `ConfigValues`.
*/
trait ConfigConvert[A] extends ConfigReader[A] with ConfigWriter[A] { outer =>

/** Transforms the values read and written by this `ConfigConvert` using two functions.
*
* @param f the function applied to values after they are read; a thrown exception will be caught and converted to a pureconfig FailureReason
* @param g the function applied to values before they are written
* @tparam B the type of the returned `ConfigConvert`
* @return a `ConfigConvert` that reads and writes values of type `B` by applying `f` and `g` on read and write,
* respectively.
*/
/**
* Transforms the values read and written by this `ConfigConvert` using two functions.
*
* @param f the function applied to values after they are read; a thrown exception will be caught and converted to a pureconfig FailureReason
* @param g the function applied to values before they are written
* @tparam B the type of the returned `ConfigConvert`
* @return a `ConfigConvert` that reads and writes values of type `B` by applying `f` and `g` on read and write,
* respectively.
*/
def xmap[B](f: A => B, g: B => A): ConfigConvert[B] =
ConfigConvert(map(f), contramap(g))

/** Transforms the values read and written by this `ConfigConvert` using two functions where the reader may
* specify custom failure reason.
*
* @param f the function applied to values after they are read
* @param g the function applied to values before they are written
* @tparam B the type of the returned `ConfigConvert`
* @return a `ConfigConvert` that reads and writes values of type `B` by applying `f` and `g` on read and write,
* respectively.
*/
/**
* Transforms the values read and written by this `ConfigConvert` using two functions where the reader may
* specify custom failure reason.
*
* @param f the function applied to values after they are read
* @param g the function applied to values before they are written
* @tparam B the type of the returned `ConfigConvert`
* @return a `ConfigConvert` that reads and writes values of type `B` by applying `f` and `g` on read and write,
* respectively.
*/
def xemap[B](f: A => Either[FailureReason, B], g: B => A): ConfigConvert[B] =
ConfigConvert(emap(f), contramap(g))
}

/** Provides methods to create [[ConfigConvert]] instances.
*/
/**
* Provides methods to create [[ConfigConvert]] instances.
*/
object ConfigConvert extends ConvertHelpers {

def apply[A](implicit conv: Derivation[ConfigConvert[A]]): ConfigConvert[A] = conv.value
Expand Down

0 comments on commit 7390cde

Please sign in to comment.