dry-transformer 1.0.1 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +20 -6
- data/LICENSE +2 -1
- data/README.md +8 -21
- data/dry-transformer.gemspec +12 -6
- data/lib/dry/transformer/array_transformations.rb +2 -1
- data/lib/dry/transformer/conditional.rb +2 -1
- data/lib/dry/transformer/error.rb +5 -3
- data/lib/dry/transformer/hash_transformations.rb +21 -3
- data/lib/dry/transformer/recursion.rb +3 -1
- data/lib/dry/transformer/version.rb +1 -1
- metadata +70 -10
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 951fc90cfe811be95ec2ff41b75c5f570e16d78e13594c434c67dc72986b8b1b
|
|
4
|
+
data.tar.gz: 9ff80c34ffec146bf95b189faef2b6fb8e31b23272b35899d9d8af60db8dddb2
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 5c1a12f368f92a769512fa70f815dbd0e65c6c6663a0e7ac4ad727c3b63adc85573b9719dfea3016435cb511e5fbc3b2e64a1a7374635293b2bd2178ac99007e
|
|
7
|
+
data.tar.gz: 5d0d004b5bcb9bbf811c362fbfc0b3c37cd2dd1a5d72965a2732afb193c72ef6d2021a9a241483bc5eccb77c2209a28df0f55a6da7bcac7d866809748af049ba
|
data/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,20 @@
|
|
|
1
|
-
|
|
1
|
+
# Changelog
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
|
+
and this project adheres to [Break Versioning](https://www.taoensso.com/break-versioning).
|
|
7
|
+
|
|
8
|
+
## [Unreleased]
|
|
9
|
+
|
|
10
|
+
## [1.1.0] - 2025-12-03
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- Fixed using `prefix` option in `Dry::Transformer::HashTransformations.unwrap` in DSL (@flash-gordon)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
## [1.0.1] - 2022-11-23
|
|
4
18
|
|
|
5
19
|
|
|
6
20
|
### Fixed
|
|
@@ -8,9 +22,9 @@
|
|
|
8
22
|
- Auto-loading issues for array transformations (@flash-gordon)
|
|
9
23
|
|
|
10
24
|
|
|
11
|
-
[Compare v1.0.0...
|
|
25
|
+
[Compare v1.0.0...v1.0.1](https://github.com/dry-rb/dry-transformer/compare/v1.0.0...v1.0.1)
|
|
12
26
|
|
|
13
|
-
## 1.0.0 2022-11-20
|
|
27
|
+
## [1.0.0] - 2022-11-20
|
|
14
28
|
|
|
15
29
|
|
|
16
30
|
### Changed
|
|
@@ -20,7 +34,7 @@
|
|
|
20
34
|
|
|
21
35
|
[Compare v0.1.1...v1.0.0](https://github.com/dry-rb/dry-transformer/compare/v0.1.1...v1.0.0)
|
|
22
36
|
|
|
23
|
-
## 0.1.1 2020-01-14
|
|
37
|
+
## [0.1.1] - 2020-01-14
|
|
24
38
|
|
|
25
39
|
|
|
26
40
|
### Fixed
|
|
@@ -30,6 +44,6 @@
|
|
|
30
44
|
|
|
31
45
|
[Compare v0.1.0...v0.1.1](https://github.com/dry-rb/dry-transformer/compare/v0.1.0...v0.1.1)
|
|
32
46
|
|
|
33
|
-
## 0.1.0 2019-12-28
|
|
47
|
+
## [0.1.0] - 2019-12-28
|
|
34
48
|
|
|
35
49
|
Initial port of the [transproc](https://github.com/solnic/transproc) gem.
|
data/LICENSE
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
The MIT License (MIT)
|
|
2
2
|
|
|
3
|
-
Copyright (c) 2015-
|
|
3
|
+
Copyright (c) 2015-2025 Hanakai team
|
|
4
4
|
|
|
5
5
|
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
6
6
|
this software and associated documentation files (the "Software"), to deal in
|
|
@@ -18,3 +18,4 @@ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
|
|
18
18
|
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
|
19
19
|
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
20
20
|
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
21
|
+
|
data/README.md
CHANGED
|
@@ -1,30 +1,17 @@
|
|
|
1
|
-
<!---
|
|
2
|
-
[gem]: https://rubygems.org/gems/dry-transformer
|
|
3
|
-
[actions]: https://github.com/dry-rb/dry-transformer/actions
|
|
4
|
-
[codacy]: https://www.codacy.com/gh/dry-rb/dry-transformer
|
|
5
|
-
[chat]: https://dry-rb.zulipchat.com
|
|
6
|
-
[inchpages]: http://inch-ci.org/github/dry-rb/dry-transformer
|
|
1
|
+
<!--- This file is synced from hanakai-rb/repo-sync -->
|
|
7
2
|
|
|
8
|
-
|
|
3
|
+
[rubygem]: https://rubygems.org/gems/dry-transformer
|
|
4
|
+
[actions]: https://github.com/dry-rb/dry-transformer/actions
|
|
9
5
|
|
|
10
|
-
[][
|
|
11
|
-
[][actions]
|
|
12
|
-
[][codacy]
|
|
13
|
-
[][codacy]
|
|
14
|
-
[][inchpages]
|
|
6
|
+
# dry-transformer [][rubygem] [][actions]
|
|
15
7
|
|
|
16
8
|
## Links
|
|
17
9
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
## Supported Ruby versions
|
|
22
|
-
|
|
23
|
-
This library officially supports the following Ruby versions:
|
|
24
|
-
|
|
25
|
-
* MRI `>= 2.7.0`
|
|
26
|
-
* jruby `>= 9.3` (postponed until 2.7 is supported)
|
|
10
|
+
- [User documentation](https://dry-rb.org/gems/dry-transformer)
|
|
11
|
+
- [API documentation](http://rubydoc.info/gems/dry-transformer)
|
|
12
|
+
- [Forum](https://discourse.dry-rb.org)
|
|
27
13
|
|
|
28
14
|
## License
|
|
29
15
|
|
|
30
16
|
See `LICENSE` file.
|
|
17
|
+
|
data/dry-transformer.gemspec
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
#
|
|
3
|
+
# This file is synced from hanakai-rb/repo-sync. To update it, edit repo-sync.yml.
|
|
4
4
|
|
|
5
5
|
lib = File.expand_path("lib", __dir__)
|
|
6
6
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
@@ -8,8 +8,8 @@ require "dry/transformer/version"
|
|
|
8
8
|
|
|
9
9
|
Gem::Specification.new do |spec|
|
|
10
10
|
spec.name = "dry-transformer"
|
|
11
|
-
spec.authors = ["
|
|
12
|
-
spec.email = ["
|
|
11
|
+
spec.authors = ["Hanakai team"]
|
|
12
|
+
spec.email = ["info@hanakai.org"]
|
|
13
13
|
spec.license = "MIT"
|
|
14
14
|
spec.version = Dry::Transformer::VERSION.dup
|
|
15
15
|
|
|
@@ -21,14 +21,20 @@ Gem::Specification.new do |spec|
|
|
|
21
21
|
spec.executables = []
|
|
22
22
|
spec.require_paths = ["lib"]
|
|
23
23
|
|
|
24
|
+
spec.extra_rdoc_files = ["README.md", "CHANGELOG.md", "LICENSE"]
|
|
25
|
+
|
|
24
26
|
spec.metadata["allowed_push_host"] = "https://rubygems.org"
|
|
25
27
|
spec.metadata["changelog_uri"] = "https://github.com/dry-rb/dry-transformer/blob/main/CHANGELOG.md"
|
|
26
28
|
spec.metadata["source_code_uri"] = "https://github.com/dry-rb/dry-transformer"
|
|
27
29
|
spec.metadata["bug_tracker_uri"] = "https://github.com/dry-rb/dry-transformer/issues"
|
|
30
|
+
spec.metadata["funding_uri"] = "https://github.com/sponsors/hanami"
|
|
28
31
|
|
|
29
|
-
spec.required_ruby_version = ">=
|
|
32
|
+
spec.required_ruby_version = ">= 3.1.0"
|
|
30
33
|
|
|
31
|
-
|
|
34
|
+
spec.add_runtime_dependency "bigdecimal"
|
|
32
35
|
spec.add_runtime_dependency "zeitwerk", "~> 2.6"
|
|
33
|
-
|
|
36
|
+
spec.add_development_dependency "bundler"
|
|
37
|
+
spec.add_development_dependency "rake"
|
|
38
|
+
spec.add_development_dependency "rspec"
|
|
34
39
|
end
|
|
40
|
+
|
|
@@ -17,7 +17,8 @@ module Dry
|
|
|
17
17
|
# { 'city' => 'NYC', 'zipcode' => '312' }
|
|
18
18
|
# ]
|
|
19
19
|
# )
|
|
20
|
-
# # => [{:address=>{:city=>"Boston", :zipcode=>"123"}},
|
|
20
|
+
# # => [{:address=>{:city=>"Boston", :zipcode=>"123"}},
|
|
21
|
+
# # {:address=>{:city=>"NYC", :zipcode=>"312"}}]
|
|
21
22
|
#
|
|
22
23
|
# @api public
|
|
23
24
|
module ArrayTransformations
|
|
@@ -35,7 +35,8 @@ module Dry
|
|
|
35
35
|
!fn[value]
|
|
36
36
|
end
|
|
37
37
|
|
|
38
|
-
# Apply the transformation function to subject if the predicate returns true,
|
|
38
|
+
# Apply the transformation function to subject if the predicate returns true,
|
|
39
|
+
# or return un-modified
|
|
39
40
|
#
|
|
40
41
|
# @example
|
|
41
42
|
# [2, 'Jane'].map do |subject|
|
|
@@ -7,9 +7,11 @@ module Dry
|
|
|
7
7
|
|
|
8
8
|
class FunctionNotFoundError < Error
|
|
9
9
|
def initialize(function, source = nil)
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
if source
|
|
11
|
+
super "No registered function #{source}[:#{function}]"
|
|
12
|
+
else
|
|
13
|
+
super "No globally registered function for #{function}"
|
|
14
|
+
end
|
|
13
15
|
end
|
|
14
16
|
end
|
|
15
17
|
end
|
|
@@ -5,7 +5,7 @@ module Dry
|
|
|
5
5
|
# Transformation functions for Hash objects
|
|
6
6
|
#
|
|
7
7
|
# @example
|
|
8
|
-
# require 'dry/transformer/
|
|
8
|
+
# require 'dry/transformer/hash_transformations'
|
|
9
9
|
#
|
|
10
10
|
# include Dry::Transformer::Helper
|
|
11
11
|
#
|
|
@@ -15,9 +15,16 @@ module Dry
|
|
|
15
15
|
# # => {:address => {:street => "Street 1", :zipcode => "123"}}
|
|
16
16
|
#
|
|
17
17
|
# @api public
|
|
18
|
+
# rubocop:disable Metrics/ModuleLength
|
|
18
19
|
module HashTransformations
|
|
19
20
|
extend Registry
|
|
20
21
|
|
|
22
|
+
# @api private
|
|
23
|
+
Undefined = Object.new.freeze
|
|
24
|
+
|
|
25
|
+
# @api private
|
|
26
|
+
EMPTY_HASH = {}.freeze
|
|
27
|
+
|
|
21
28
|
# Map all keys in a hash with the provided transformation function
|
|
22
29
|
#
|
|
23
30
|
# @example
|
|
@@ -260,7 +267,9 @@ module Dry
|
|
|
260
267
|
# Collapse a nested hash from a specified key
|
|
261
268
|
#
|
|
262
269
|
# @example
|
|
263
|
-
# Dry::Transformer(
|
|
270
|
+
# Dry::Transformer(
|
|
271
|
+
# :unwrap, :address, [:street, :zipcode]
|
|
272
|
+
# )[address: { street: 'Street', zipcode: '123' }]
|
|
264
273
|
# # => {street: "Street", zipcode: "123"}
|
|
265
274
|
#
|
|
266
275
|
# @param [Hash] source_hash
|
|
@@ -273,9 +282,14 @@ module Dry
|
|
|
273
282
|
# @return [Hash]
|
|
274
283
|
#
|
|
275
284
|
# @api public
|
|
276
|
-
|
|
285
|
+
# rubocop:disable Metrics/AbcSize, Metrics/PerceivedComplexity
|
|
286
|
+
def self.unwrap(source_hash, root, selected = nil, options = Undefined)
|
|
277
287
|
return source_hash unless source_hash[root]
|
|
278
288
|
|
|
289
|
+
selected, options = nil, selected if options.equal?(Undefined) && selected.is_a?(::Hash)
|
|
290
|
+
options = EMPTY_HASH if options.equal?(Undefined)
|
|
291
|
+
prefix = options.fetch(:prefix, false)
|
|
292
|
+
|
|
279
293
|
add_prefix = lambda do |key|
|
|
280
294
|
combined = [root, key].join("_")
|
|
281
295
|
root.is_a?(::Symbol) ? combined.to_sym : combined
|
|
@@ -292,6 +306,7 @@ module Dry
|
|
|
292
306
|
hash.delete(root) if nested_hash.empty? && !nested_contains_root_key
|
|
293
307
|
end
|
|
294
308
|
end
|
|
309
|
+
# rubocop:enable Metrics/AbcSize, Metrics/PerceivedComplexity
|
|
295
310
|
|
|
296
311
|
# Folds array of tuples to array of values from a specified key
|
|
297
312
|
#
|
|
@@ -377,6 +392,7 @@ module Dry
|
|
|
377
392
|
# @param [Array] filters A list of attribute names that should be evaluated
|
|
378
393
|
#
|
|
379
394
|
# @api public
|
|
395
|
+
# rubocop:disable Metrics/PerceivedComplexity
|
|
380
396
|
def self.eval_values(hash, args, filters = [])
|
|
381
397
|
hash.each_with_object({}) do |(key, value), output|
|
|
382
398
|
output[key] =
|
|
@@ -398,6 +414,7 @@ module Dry
|
|
|
398
414
|
end
|
|
399
415
|
end
|
|
400
416
|
end
|
|
417
|
+
# rubocop:enable Metrics/PerceivedComplexity
|
|
401
418
|
|
|
402
419
|
# Merge a hash recursively
|
|
403
420
|
#
|
|
@@ -427,4 +444,5 @@ module Dry
|
|
|
427
444
|
end
|
|
428
445
|
end
|
|
429
446
|
end
|
|
447
|
+
# rubocop:enable Metrics/ModuleLength
|
|
430
448
|
end
|
|
@@ -27,7 +27,9 @@ module Dry
|
|
|
27
27
|
# Recursively apply the provided transformation function to an enumerable
|
|
28
28
|
#
|
|
29
29
|
# @example
|
|
30
|
-
# Dry::Transformer(
|
|
30
|
+
# Dry::Transformer(
|
|
31
|
+
# :recursion, Dry::Transformer(:is, ::Hash, Dry::Transformer(:symbolize_keys))
|
|
32
|
+
# )[
|
|
31
33
|
# {
|
|
32
34
|
# 'id' => 1,
|
|
33
35
|
# 'name' => 'Jane',
|
metadata
CHANGED
|
@@ -1,15 +1,29 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: dry-transformer
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.0
|
|
4
|
+
version: 1.1.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
|
-
-
|
|
8
|
-
autorequire:
|
|
7
|
+
- Hanakai team
|
|
8
|
+
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2025-12-03 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: bigdecimal
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - ">="
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: '0'
|
|
20
|
+
type: :runtime
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - ">="
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: '0'
|
|
13
27
|
- !ruby/object:Gem::Dependency
|
|
14
28
|
name: zeitwerk
|
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -24,12 +38,57 @@ dependencies:
|
|
|
24
38
|
- - "~>"
|
|
25
39
|
- !ruby/object:Gem::Version
|
|
26
40
|
version: '2.6'
|
|
41
|
+
- !ruby/object:Gem::Dependency
|
|
42
|
+
name: bundler
|
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
|
44
|
+
requirements:
|
|
45
|
+
- - ">="
|
|
46
|
+
- !ruby/object:Gem::Version
|
|
47
|
+
version: '0'
|
|
48
|
+
type: :development
|
|
49
|
+
prerelease: false
|
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
+
requirements:
|
|
52
|
+
- - ">="
|
|
53
|
+
- !ruby/object:Gem::Version
|
|
54
|
+
version: '0'
|
|
55
|
+
- !ruby/object:Gem::Dependency
|
|
56
|
+
name: rake
|
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
|
58
|
+
requirements:
|
|
59
|
+
- - ">="
|
|
60
|
+
- !ruby/object:Gem::Version
|
|
61
|
+
version: '0'
|
|
62
|
+
type: :development
|
|
63
|
+
prerelease: false
|
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
+
requirements:
|
|
66
|
+
- - ">="
|
|
67
|
+
- !ruby/object:Gem::Version
|
|
68
|
+
version: '0'
|
|
69
|
+
- !ruby/object:Gem::Dependency
|
|
70
|
+
name: rspec
|
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
|
72
|
+
requirements:
|
|
73
|
+
- - ">="
|
|
74
|
+
- !ruby/object:Gem::Version
|
|
75
|
+
version: '0'
|
|
76
|
+
type: :development
|
|
77
|
+
prerelease: false
|
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
79
|
+
requirements:
|
|
80
|
+
- - ">="
|
|
81
|
+
- !ruby/object:Gem::Version
|
|
82
|
+
version: '0'
|
|
27
83
|
description: Data transformation toolkit
|
|
28
84
|
email:
|
|
29
|
-
-
|
|
85
|
+
- info@hanakai.org
|
|
30
86
|
executables: []
|
|
31
87
|
extensions: []
|
|
32
|
-
extra_rdoc_files:
|
|
88
|
+
extra_rdoc_files:
|
|
89
|
+
- README.md
|
|
90
|
+
- CHANGELOG.md
|
|
91
|
+
- LICENSE
|
|
33
92
|
files:
|
|
34
93
|
- CHANGELOG.md
|
|
35
94
|
- LICENSE
|
|
@@ -64,7 +123,8 @@ metadata:
|
|
|
64
123
|
changelog_uri: https://github.com/dry-rb/dry-transformer/blob/main/CHANGELOG.md
|
|
65
124
|
source_code_uri: https://github.com/dry-rb/dry-transformer
|
|
66
125
|
bug_tracker_uri: https://github.com/dry-rb/dry-transformer/issues
|
|
67
|
-
|
|
126
|
+
funding_uri: https://github.com/sponsors/hanami
|
|
127
|
+
post_install_message:
|
|
68
128
|
rdoc_options: []
|
|
69
129
|
require_paths:
|
|
70
130
|
- lib
|
|
@@ -72,15 +132,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
72
132
|
requirements:
|
|
73
133
|
- - ">="
|
|
74
134
|
- !ruby/object:Gem::Version
|
|
75
|
-
version:
|
|
135
|
+
version: 3.1.0
|
|
76
136
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
77
137
|
requirements:
|
|
78
138
|
- - ">="
|
|
79
139
|
- !ruby/object:Gem::Version
|
|
80
140
|
version: '0'
|
|
81
141
|
requirements: []
|
|
82
|
-
rubygems_version: 3.
|
|
83
|
-
signing_key:
|
|
142
|
+
rubygems_version: 3.3.27
|
|
143
|
+
signing_key:
|
|
84
144
|
specification_version: 4
|
|
85
145
|
summary: Data transformation toolkit
|
|
86
146
|
test_files: []
|