What's Changed
- Fix decoder error handling: Triple, BooleanArray, Regex by @sksamuel in #520
- Add @ConfigEnumDefault for enum fallback values (#478) by @sksamuel in #521
- Fix decoder bugs: BigInteger/BigDecimal precision and collection element type by @sksamuel in #519
- Add tests confirming decoder bug fixes from #519 by @sksamuel in #523
- Don't crash on empty-key ${} placeholders (#469) by @sksamuel in #522
- Allow negative endpoints in IntRange / LongRange decoders by @sksamuel in #542
- Let arrow/vavr OptionDecoder accept MapNode and ArrayNode by @sksamuel in #538
- Fix ${random.string(N)} never producing the letter 'z' by @sksamuel in #531
- Fix ${{ hoplite:env }} returning the host CPU count by @sksamuel in #529
- Fix ${random.double} returning a Long instead of a Double by @sksamuel in #527
- Keep acronyms together in SnakeCase / KebabCase param mappers by @sksamuel in #544
- Stop ConfigSource.fromPaths/fromClasspathResources leaking streams by @sksamuel in #532
- Stop ConfigSource.fromResourcesOrFiles leaking the probe stream by @sksamuel in #539
- Use string concatenation in MonthDayDecoder instead of prependIndent by @sksamuel in #543
- Catch exceptions in hoplite-javax security decoders by @sksamuel in #541
- Add SecretFilesPreprocessor to add secrets into configs referenced from a dir by @Bengreen in #470
- Close the input stream in InputStreamPropertySource by @sksamuel in #540
- Fix RandomContextResolver parameterised paths never matching by @sksamuel in #528
- Stop SystemPropertyContextResolver crashing on empty-key placeholders by @sksamuel in #537
- Fix env-var list elements coming out in HashMap iteration order by @sksamuel in #530
- SecretFilesPreprocessor: switch placeholder format to ${secret:key} by @sksamuel in #547
- SecretFilesPreprocessor: surface missing-file as a clean ConfigFailure by @sksamuel in #581
- docs: fix JsonPropertySource example referencing the wrong class by @sksamuel in #582
- Fix typos and one wrong-verb docstring by @sksamuel in #580
- hoplite-aws2: use Locale.ROOT for RegionDecoder case folding by @sksamuel in #564
- Fix typo in cascade error message: "overriden" -> "overridden" by @sksamuel in #575
- addResourceOrFileSource: forward the optional flag in the filesystem branch by @sksamuel in #571
- addResourceOrFileSource: stop dropping the leading slash before the file probe by @sksamuel in #563
- IntDecoder/ByteDecoder/ShortDecoder: range-check LongNode instead of silently truncating by @sksamuel in #579
- hoplite-toml: surface TOML parse errors instead of returning a partial result by @sksamuel in #554
- Don't crash the loader on ${random.int(0)} and similar empty ranges by @sksamuel in #569
- Fix typos: "Uknown", "seperated", "recursivel" by @sksamuel in #556
- EnumDecoder: match against Enum.name, not toString() by @sksamuel in #565
- Close input stream in ConfigFilePropertySource on the empty-file paths by @sksamuel in #551
- hoplite-hdfs: catch IllegalArgumentException from Hadoop Path constructor by @sksamuel in #562
- Fix paginated SSM parameter ordering: last page no longer comes first by @sksamuel in #570
- Fix @deprecated ReplaceWith pointing at the same misspelled method by @sksamuel in #566
- Recognise Null / NULL / ~ as YAML null literals by @sksamuel in #536
- hoplite-yaml / hoplite-hocon: pin reader charset to UTF-8 by @sksamuel in #573
- AWS preprocessors: distinguish "secret is not JSON" from "key missing in secret JSON" by @sksamuel in #559
- Render cascade override message in the correct direction by @sksamuel in #578
- Close the InputStreamReader in PropsParser by @sksamuel in #567
- SealedClassDecoder: align deriveInstance object lookup with java.simpleName by @sksamuel in #576
- Lower-case file extensions so the parser registry lookup is case-insensitive by @sksamuel in #574
- hoplite-aws2: AwsSecretsManagerSource null-checks secretString() by @sksamuel in #568
- docs: addPathSource and PropertySource.path read from the filesystem, not classpath by @sksamuel in #572
- hoplite-watch: stop FileWatcher spin-looping when the watch service is closed by @sksamuel in #558
- hoplite-yaml: pass the error message to error() instead of a lambda by @sksamuel in #553
- hoplite-aws-kotlin: paginate ParameterStorePathPreprocessor results by @sksamuel in #552
- docs: add SecretFilesPreprocessor section to README by @sksamuel in #550
- Make SystemPropertiesPropertySource prefix configurable (#545) by @sksamuel in #546
- hoplite-watch: route FixedIntervalWatchable callback failures through errorHandler by @sksamuel in #560
- ReloadableConfig: publish errorHandler safely to the watcher thread (@volatile) by @sksamuel in #588
- CommandLinePropertySource: don't crash when delimiter is a substring of the prefix by @sksamuel in #584
- LookupPreprocessor: resolve cased/dashed paths when PathNormalizer is active (#503) by @sksamuel in #591
- SealedClassDecoder: don't crash when no sealed subtype matches the node by @sksamuel in #577
- HashObfuscator: emit the documented number of hash characters by @sksamuel in #585
- Stop legacy preprocessors from mangling ${{...}} (#472) by @sksamuel in #525
- Fix InformationUnit.Octets ratio (1 octet == 1 byte) by @sksamuel in #549
- docs: document Spring-style env-var binding rules in the README by @sksamuel in #548
- Random resolver/preprocessor: never return a negative int/long by @sksamuel in #590
- Don't discard a scalar when a higher-precedence map shares its key (#592) by @sksamuel in #594
- MapDecoder: mark key/value paths as used in array-of-objects form by @sksamuel in #557
- Mark vavr Map entries as used so strict() doesn't flag them by @sksamuel in #535
- Close the MANIFEST.MF input stream in ManifestContextResolver by @sksamuel in #555
- Close internal stream wrappers in YAML / JSON / HOCON parsers by @sksamuel in #561
- loadProps: preserve null elements in list values instead of dropping them by @sksamuel in #589
- ContextResolver: split key/default on the first ':-' so defaults can contain ':-' by @sksamuel in #587
- Mark LinkedHashMap entries as used so strict() doesn't flag them by @sksamuel in #534
- Don't flag env vars or sysprops as unused in strict() mode (#505) by @sksamuel in #524
New Contributors
Full Changelog: v3.0.0.RC3...v3.0.0