- New features
- Added support for Scala 3 derivation of
EnumConfigWriter
andEnumConfigConvert
using aderives
clause. - Added a new
pureconfig-generic-scala3
module, a drop-in replacement of Scala 2'spureconfig-generic
for semiauto derivation in Scala 3. It supports most of the types supported inpureconfig-generic
and accepts product and coproduct hints.
- Added support for Scala 3 derivation of
- New features
- Added new
pureconfig-pekko
andpureconfig-pekko-http
modules with relevantConfigReader
s andConfigWriter
s for Pekko and Pekko HTTP types.
- Added new
Maintenance update to update dependency versions.
Maintenance update to update dependency versions and fix issues with previously published modules.
Maintenance update to update dependency versions.
- New features
- Added Scala 3 support for several modules.
- New features
- Added a new
ensure
combinator toConfigReader
; - Added a new
pureconfig-spark
module with relevantConfigReader
s andConfigWriter
s for Spark types; - Added a new
pureconfig-ip4s
module with relevantConfigReader
s andConfigWriter
s for ip4s types.
- Added a new
-
Breaking changes
- Removed code deprecated on or before v0.11.x.
-
New features
- Added support for
ChronoUnit
.
- Added support for
Support for Scala 3.0 was introduced.
- New features
- Added beta support for Scala 3 type class derivation. See documentation for details.
- Breaking changes
- The
Derivation
type class was removed. If you were relying on it, e.g. by usingDerivation.Successful
directly or usingDerivation
values in function signatures, you can simply useConfigReader
andConfigWriter
directly. The docs were updated to recommend splain as a tool to debug implicit not found errors.
- The
Support for Scala 2.11 was dropped and support for Scala 3.0 (RC1) was introduced.
- New features
- Added support for screaming snake case on naming conventions.
- Breaking changes
- Cursors are now backed up by
Option[ConfigValue]
instead ofConfigValue
. Code accessing thevalue
of a cursor should usevalueOpt
instead (withNone
replacingnull
in undefined values).
- Cursors are now backed up by
-
Breaking changes
ConfigOrigin
is now used in place ofConfigValueLocation
to represent the origin ofConfigValue
s;- The
ProductHint
andCoproductHint
API was changed to allow better customization of how generic derivations are performed.
-
New features
ConfigReader
andConfigWriter
instances forByte
;- Errors are now accumulated in readers derived using the
pureconfig-magnolia
module; - The error message displayed when using
FirstSuccessCoproductHint
and no valid coproduct option is found now shows the errors raised when attempting to derive each option; ConfigReader
andConfigWriter
instances forConfigMemorySize
;ConfigConvert
now has a more natural constructor;ConfigConvert
now has thexemap
combinator to transform values read and written, where the reader function may specify custom failure reasons (similar to theemap
ofConfigReader
).
-
Bug fixes
- Key names are no longer built using
Symbol#toString
, making them compatible with Scala 2.13.3.
- Key names are no longer built using
- Bug fixes
pureconfig-magnolia
now uses existingConfigReader
instances in auto-derivation mode.
- New features
- Created an alternative generic derivation module that uses Magnolia instead of Shapeless (
pureconfig-magnolia
); ConfigSource.resources
now allows users to specify the class loader to use;- Added a
prettyPrint
method toConfigReaderFailures
.
- Created an alternative generic derivation module that uses Magnolia instead of Shapeless (
- New features
- Added support for Scala 2.13 in the
pureconfig-cats
,pureconfig-cats-effect
andpureconfig-circe
modules; - Added a
ConfigSource
that reads configs from YAML documents in thepureconfig-yaml
module.
- Added support for Scala 2.13 in the
- New features
- Introduced the new
ConfigSource
API, a new way of specifying how and from where configs should be read and merged. AllloadConfig*
methods inpureconfig
are now deprecated in favor of config sources.
- Introduced the new
Support for Scala 2.13 was introduced.
Support for Scala 2.13 (RC1) was introduced.
-
Breaking changes
- The default transformation in
FieldCoproductHint
changed from converting class names to lower case to converting them to kebab case (e.g.ConfigOption
is converted toconfig-option
). The old behavior can be retained by putting in scope animplicit def coproductHint[T] = new FieldCoproductHint[T]("type") { override def fieldValue(name: String): String = name.toLowerCase }
.
- The default transformation in
-
New features
- Added
deriveEnumerationReader
,deriveEnumerationWriter
andderiveEnumerationConvert
to thepureconfig.generic.semiauto
package, allowing the derivation of readers and writers for enumerations encoded as sealed traits of case objects. As a consequence, theEnumCoproductHint
is now deprecated in favor of these new methods; CoproductHint
now exposes anoOptionFound
method allowing implementations to configure the failure reasons given when no option for a sealed family was able to be read.
- Added
- New features
- Added
ConfigReader.Result[A]
as an alias forEither[ConfigReaderFailures, A]
; - Introduced
FluentConfigCursor
, an alternative API toConfigCursor
focused on config navigation over error handling.
- Added
-
New features
loadConfigFromFiles
now accepts anamespace
parameter like the otherloadConfig*
varieties. (#437)
-
Bug fixes
scala-compiler
andscala-reflect
dependencies are nowprovided
, rather than regular, dependencies. (#434)
Support for Scala 2.10 was dropped.
-
Breaking changes
- Auto derivation of readers and writers for case classes and sealed traits is now disabled by default. Now users need
to import
pureconfig.generic.auto._
everywhere a config is loaded or written (e.g. in files with calls toloadConfig
); - The
AllowMissingKeys
trait was renamed toReadsMissingKeys
.
- Auto derivation of readers and writers for case classes and sealed traits is now disabled by default. Now users need
to import
-
New features
- The auto-derivation features of PureConfig, powered by shapeless, were extracted to a separate
pureconfig-generic
module, whilepureconfig-core
was left with only the absolute minimum for PureConfig to be useful.pureconfig
will continue to be published as a Maven artifact aggregating the two aforementioned artifacts; - Users have now more control over reader and writer derivation. See the docs for more information;
- New factory methods
forProduct1
,forProduct2
, ...,forProduct22
were added to the companion objects ofConfigReader
andConfigWriter
; - A new
WritesMissingKeys
trait enables custom writers to handle missing keys, a feature previously restricted to the built-inOption
writer; - Cursors now perform the
automatic type conversions
required by HOCON when
as<type>
methods are called. Cursors now provideasBoolean
,asLong
,asInt
,asShort
,asDouble
andasFloat
.
- The auto-derivation features of PureConfig, powered by shapeless, were extracted to a separate
-
New features
- Users can now configure whether
loadConfigFromFiles
ignores or fails on non-existing or unreadable files; - Custom
ConfigRenderOptions
can now be passed to all config writing API methods; - PureConfig can now read
Period
instances written in the human-readable format supported by HOCON; - New configurable instances allow reading and writing maps with any key type, provided the respective conversion to/from strings;
ConfigCursor
has a newatPath
method for deep navigation into the config;- New
pureconfig-yaml
module adding support to load configs from YAML files.
- Users can now configure whether
-
Bug fixes
- Fixed a bug where PureConfig was not working when custom preludes were used.
- New features
ConfigReader
andConfigWriter
forChar
;- Modules for
fs2
,hadoop
andhttp4s
.
-
New features
- A new
ConfigCursor
now provides idiomatic, safe methods to navigate through a config. It also holds context for building failures with a more accurate location and path in the config; ConfigReaderFailure
was revamped to facilitate the propagation of context on failures. There is now a separation between higher-levelConfigReaderFailures
and concrete, location-agnosticFailureReason
s.
- A new
-
Breaking changes
ConfigReader
, as well as many related methods and classes, now reads configs fromConfigCursor
instances instead of from directConfigValue
s. Code can be migrated simply by accessing thevalue
field ofConfigCursor
whenever aConfigValue
is needed. However, rewriting the code to use the newConfigCursor
methods is heavily recommended as it provides safer config handling and much better error handling;- Code for handling and raising failures may not work due to the revamp of the failure model. Inside
ConfigReader
instances users should now use thefailed
method of the newConfigCursor
instead of manually creating instances ofConfigReaderFailures
; - The
CannotConvertNull
failure was removed, being superseeded byKeyNotFound
; - Methods deprecated in previous versions were removed.
-
Bug fixes
- Fixed a bug where some or all
Derivation
cases outside thepureconfig
package were not showing the full error description.
- Fixed a bug where some or all
-
New features
loadConfig
methods now allow loading any type from a config when using a namespace, and not only types represented by config objects;ConfigFieldMapping
now has awithOverrides
method that allows users to easily define exceptional cases to an existing mapping;ConfigReader
andConfigWriter
forjava.math.BigDecimal
andjava.math.BigInteger
;ConfigReader
forBoolean
s allows reading them from "yes", "no", "on" and "off" strings;ConfigReader
andConfigWriter
forshapeless.HList
;ConfigReader
for Scala tuples can now read fromConfigLists
s;- Added an experimental way to debug when a converter fails to be derived because an implicit is not found. See the documentation for more information on how to enable it.
-
Breaking changes
ConfigWriter
for tuples now writes them asConfigList
s, instead of aConfigObject
with keys_1
,_2
, and so on.
-
Bug fixes
- A breaking change introduced in v0.7.1 where
loadConfigFromFiles
stopped allowing missing files was reverted; loadConfig
methods no longer throw an exception when passed a namespace where one of the keys is not a config object;- The
xmap
ofConfigConvert
and themap
method ofConfigReader
now wrap exceptions that the functions used to map might throw in aConfigReaderFailure
; FieldCoproductHint
now removes the disambiguating key from the config object before passing it to the reader of a coproduct option.
- A breaking change introduced in v0.7.1 where
- Bug fixes
- Fix value class
ConfigReader
andConfigWriter
derivation [#253].
- Fix value class
- New features
ConfigReader
,ConfigWriter
andConfigConvert
now have combinators such asmap
,flatMap
andcontramap
, making them easier to compose;- New mechanism to read and write value classes. The readers and writers of the inner type are used instead of the ones for products;
- New
EnumCoproductHint
for sealed families of case objects where objects are written and read as strings with their type names; ConfigReader
andConfigWriter
instances forPattern
andRegex
;ConfigReader
andConfigWriter
instances forjava.time.Duration
;ConfigReader
andConfigWriter
forjava.io.File
;ConfigReader
andConfigWriter
for arbitrary Javaenum
s;- Improved error messages when a failure occurs reading a config;
- Bug fixes
Duration.Undefined
is correctly handled when reading and writing configurations [#184];loadConfig
method now handles properly cases where a requested config file cannot be read and when a provided namespace doesn't exist.
-
New features
ConfigConvert
is now a union of two new traits -ConfigReader
for reading configs andConfigWriter
for writing them:- Having an implicit
ConfigReader
in scope is enough to read a config to a instance of a given type; - Having a
ConfigWriter
is enough for writing instances to configs; ConfigConvert
can still be used everywhere it was before and is advisable when both operations are needed.
- Having an implicit
- Many constructors for
ConfigConvert
instances were deprecated, while new ones were added in the companion objects ofConfigReader
,ConfigWriter
andConfigConvert
. The deprecation message of each one indicates the new method to use; - Add
ConfigFactoryWrapper
to control exceptions from typesafeConfigFactory
; - Modify the message of
ConfigReaderException
to group errors by keys in the configuration, instead of by type of error; - Add a path (
Option[String]
) toConfigReaderFailure
, in order to expose more information (if available) about the key in the configuration whose value raised the failure.
-
Breaking changes
loadConfigFromFiles
works onPath
instead ofFile
for consistency;ConfigValueLocation
now usesURL
instead ofPath
to encode locations ofConfigValue
s.
-
Bug fixes
pureconfig.load*
methods don't throw exceptions on malformed configuration anymore and wrap errors inConfigReaderFailures
[#148].
-
New features
- New
ProductHint
trait allowing customization of the derivedConfigConvert
for case classes, superseedingConfigFieldMapping
(docs). In addition to defining field name mappings,ProductHint
instances control: - Support for reading and writing
java.util.UUID
s; - Support for reading and writing
java.nio.file.Path
s; - Support for reading and writing
java.net.URI
s; - Support multiple failures, e.g. when multiple fields of a class fail to convert;
- Add
ConfigReaderFailure
ADT to model failures andConfigReaderFailures
to represent a non empty list of errors; - Add
ConfigValueLocation
, which is the physical location of a ConfigValue represented by a file name and a line number; - Add
loadConfigOrThrow
methods to the API; - Add helpers to create
ConfigConvert
:ConfigConvert.fromStringConvert
that requires a functionString => Either[ConfigReaderFailure, T]
ConfigConvert.fromStringConvertTry
that requires a functionString => Try[T]
ConfigConvert.fromStringConvertOpt
that requires a functionString => Option[T]
- Add
ConfigConvert.catchReadError
to convert a function that can throw exception into a safe function that returns aEither[CannotConvert, T]
;
- New
-
Breaking changes
ConfigConvert.from
now returns a value of typeEither[ConfigReaderFailures, T]
instead ofTry[T]
;CoproductHint
has been changed to adapt to the newConfigConvert
:CoproductHint.from
now returns a value of typeEither[ConfigReaderFailures, Option[ConfigValue]]
CoproductHint.to
now returns a value of typeEither[ConfigReaderFailures, Option[ConfigValue]]
- The default field mapping changed from camel case config keys (e.g.
exampleKey
) to kebab case keys (e.g.example-key
). Case class fields are still expected to be camel case. The old behavior can be retained by putting in scope animplicit def productHint[T] = ProductHint[T](ConfigFieldMapping(CamelCase, CamelCase))
; ConfigFieldMapping
has no type parameters now;ConfigFieldMapping
was replaced byProductHint
as the type of object to put in scope in order to customize the derivation ofConfigConvert
for case class. OldConfigFieldMapping
implicit instances in scope have no effect now. The migration can be done by replacing code likeimplicit def mapping: ConfigFieldMapping[T] = <mapping>
withimplicit def productHint: ProductHint[T] = ProductHint(<mapping>)
;ConfigConvert.fromString
,ConfigConvert.fromNonEmptyString
,ConfigConvert.vstringConvert
,ConfigConvert.nonEmptyStringConvert
are now deprecated and the new helpers should be used instead.
- New features
- More consistent handling of missing keys: if a config key is missing pureconfig always throws a
KeyNotFoundException
now, unless theConfigConvert
extends the newAllowMissingKey
trait. - Add support for the
java.time
package. Converters types which support different string formats, such asLocalDate
, must be configured before they can be used. See the documentation for more details. - Add support for converting objects with numeric keys into lists. This is a functionallity also supported by typesafe config since version 1.0.1 and discussed in the following issue.
- More consistent handling of missing keys: if a config key is missing pureconfig always throws a
- New features
- Sealed families are now converted to and from configs unambiguously by using an extra
type
field (customizable) in their config representation; - New
CoproductHint
trait which allows customization of the derivedConfigConvert
for sealed families;
- Sealed families are now converted to and from configs unambiguously by using an extra
- Breaking changes
- The default config representation for sealed families has changed:
- By default pureconfig now expects to find a
type
field containing the lowercase simple class name of the type to be read. For example, for a family includingDogConf
andCatConf
, pureconfig expects to find atype: "dogconf"
field in the config file; - The old behavior can be restored by putting an implicit instance of
FirstSuccessCoproductHint
in scope (the migration to the new format is strongly recommended though, as the previous one may lead to ambiguous behavior); - More information about the default representation and on how to customize it can be seen in the documentation.
- By default pureconfig now expects to find a
- The default config representation for sealed families has changed:
- Bug fixes
0
is accepted again as a validDuration
in configs.