Added
- #644: Added
rubocop-spellcheckto the lint task for Ruby and documentation, with reviewed project vocabulary - @dblock. - #636: Added opt-in per-property lazy loaders for Dash and Trash, with transformations, coercion, defaults, and required-property validation deferred until access, following #587 - @dblock.
- #635: Parse README Ruby examples with Kramdown and execute them in CI with isolated optional dependencies - @dblock.
- #623: Documented Dash validation with ActiveModel and added integration coverage, following #300, reported by @SkyCrawl, with the ActiveModel approach suggested by @martinstreicher and endorsed by @dblock.
- #625: Added an opt-in
YamlParserthat parses YAML without evaluating ERB, while preservingMash.load's existing ERB-enabled default for compatibility, following #575 - @bo-tato, @dblock. - #626: Added executable YARD examples for every public class, module, and method, with public API example coverage enforced in Rake and CI, following the documentation work in #421 - @michaelherold, @dblock.
- #621: Added
Mash::UnderscoreKeyson top ofTransformKeysfor camel-case and hyphenated key normalization, following #566 - @arianf, @dblock. - #620: Added configurable
Mash::TransformKeyskey normalization as a foundation for #566 - @arianf, @dblock. - #618: Added
Hashie::Extensions::DeepGrepfor regular-expression searches of nested hashes and arrays, following #528 - @vmarutha, @dblock. - #617: Documented nil coercion bypass versus Dash defaults and added initialization, assignment, update, and inheritance regression coverage, following #472 - @bobbytables, @dblock.
- #611: Added callable coercers, including bound methods and dry-types objects, following #379 and #239 - @mkcode, @dblock.
- #612: Added
Hashie::Extensions::DeepMergeInitializerto recursively initialize Hash subclasses, including hashes inside arrays, following #382 - @sazor, @dblock. - #592: Added support for Ruby 4.0 - @dblock.
- #595: Added test coverage reporting with Coveralls - @dblock.
- #597: Fixed coverage reporting to Coveralls to work on pull requests via
GITHUB_TOKEN- @dblock. - #599: Added
Hashie::Extensions::Mash::StrictKeyAccessto raise aKeyErrorfor undefined keys, including in nested Mashes - @dblock. - #601: Added
Hashie::Extensions::KernelCoercionto coerce core types using stricterKernelmethods (e.g.Kernel#Integer) instead of lenient conversion methods (e.g.#to_i) - @dblock. - #605: Added
Hashie::Extensions::Mash::RequiredKeys, allowing a Mash to require specific keys to be set while still allowing arbitrary keys - @dblock. - #608: Added
Hashie::Extensions::BlockAccessfor block-style construction of nested hashes, completing #109 as a reusable extension - @ryansouza, @dblock. - #610: Added opt-in
Hashie::Extensions::Persistablefor safe YAML loading and atomic file saves, following #262 - @maxlinc, @michaelherold, @dblock.
Changed
- #630: Enabled project-wide RuboCop with new cops, Rake and RSpec plugins, frozen string literals, autocorrections, and a refreshed baseline for remaining offenses - @dblock.
- #615: Reduced allocations in Mash array conversion while preserving
Hashie::Arraybehavior, and reused symbol names in indifferent and original-key access when available - @dblock. - #607: Standardized exception message casing and punctuation and enforced the convention with RuboCop - @dblock.
- #607: Upgraded RuboCop to 1.91.0 and consolidated exception-message checks into one CI lint job - @dblock.
- #590: Migrated Danger to use
danger-pr-commentworkflow - @dblock. - #613:
Mashconverts symbol keys withSymbol#nameon Ruby 3.0+, so reads and writes with a symbol key no longer allocate a string - @sampokuokkanen.
Removed
- Reverted #619's
deep_merge_new_hashhook in favor of the breaking-change proposal in #632, which preserves incoming hash subclasses directly - @dblock. - #622: Dropped Ruby 2.7 support, raised the minimum to Ruby 3.0, and removed obsolete Ruby version gates and symbol-conversion fallbacks, following #613 - @dblock.
Fixed
- #642: Fixed Clash Marshal serialization on MRI by no longer advertising unimplemented serialization hooks - @dblock.
- #640: Fixed Dash key transformation skipping hashes inside ordinary Ruby arrays - @dblock.
- #638: Fixed Dash and Trash properties named
required?colliding with required-property validation, following #276, reported by @maxlinc - @dblock. - #616: Fixed indifferent Trash initialization dropping source keys translated into multiple properties when ignoring undeclared fields, following #518 and #514 - @jitendra1998, @dblock.
- #609: Fixed Clash YAML serialization losing stored keys and values, preserving subclasses and parent links - @dblock.
- #593: Fix trash subclasses changing superclass transformers - @complex857.
- #606: Fix
Hashie::Mash#dupfor subclasses includingMethodAccessWithOverride, preserving default values and procs - @Boulea7. - #596: Fixed
Hashie::Extensions::Mash::DefineAccessorsraising anArgumentErrorwhen a Mash key literally matched a suffixed accessor name (e.g.foo=,foo?,foo!,foo_) - @dblock. - #602: Fixed
Hashie::Extensions::Coercion'scoerce_valuenot triggering for nested Hashes inside aMash, since Mash's own recursive Hash-to-Mash conversion ran first - @dblock. - #603: Fixed
Trash/PropertyTranslationincorrectly allowing:fromto match the property name when the types differ (e.g. a symbol property translatedfrom:a string of the same name), causing a "method redefined" warning instead of the intendedArgumentError- @dblock. - #604: Fixed
Dash#deep_transform_keys(andTrash) raisingArgumentErrorfor required properties under Rails 7+, sinceActiveSupport::Hash#deep_transform_keysbuilds its result viaself.class.new- @dblock. - #614: Fixed
Hashie::Mash#dupallocating six extra objects on every call since #606, by looking upHash#defaultandHash#default_proconce and calling them withbind_call- @sampokuokkanen.