-
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
; - Dropped support for Scala 2.10.
- 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.