hash_remapper 0.1.0 → 0.4.3
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 +5 -5
- data/.gitignore +3 -0
- data/.travis.yml +2 -2
- data/README.md +95 -23
- data/exmaples/relations.rb +100 -0
- data/exmaples/weather.rb +42 -0
- data/hash_remapper.gemspec +16 -12
- data/lib/hash_remapper.rb +57 -14
- data/lib/hash_remapper/version.rb +4 -0
- metadata +46 -30
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 849f5ac471d049fc5ed4dccb35a3dc583cc326b94196378db5444a6ce6d7c7e5
|
4
|
+
data.tar.gz: caebef5d5546e43484ace97d07e9b8a3c719a11d033b6936d9c2e67be0534a41
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 467c6ab818803bf1ac8f7c252ed60bf0ce9b02926cae155aa21cd1689aa5c05e6926716293ad45ba8c74190c6aa7b8221a7ad6658ac47394f41faefcd1369e62
|
7
|
+
data.tar.gz: 90897ecf9b5bdc3bb6ee6b60c09721a9f0a5236fd2e5f5bc4d03580beb83a337a8e36f94e0294ea8005fe0eee26a20dfc5521f43502d10a8f8ebeef73a8f58ee
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -5,6 +5,8 @@
|
|
5
5
|
</p>
|
6
6
|
|
7
7
|
> A little lib which maps original keys to the new ones <sup>[*](#features)</sup>
|
8
|
+
>
|
9
|
+
> [](https://travis-ci.org/smileart/hash_remapper) 
|
8
10
|
|
9
11
|
## Installation
|
10
12
|
|
@@ -26,36 +28,41 @@ Or install it yourself as:
|
|
26
28
|
|
27
29
|
* maps original keys to the new ones [1](#map)
|
28
30
|
* auto-ignores all the skipped keys [2](#ignore)
|
29
|
-
*
|
30
|
-
* allows remap keys within preprocessing [4](#preprocessing)
|
31
|
+
* preprocess a value with a lambda [3](#lambda)
|
32
|
+
* allows to remap the keys within preprocessing [4](#preprocessing)
|
31
33
|
* allows to keep data subsets only [5](#subset)
|
32
|
-
* allows to include data with the original
|
34
|
+
* allows to include data with the original key names [6](#originals)
|
33
35
|
* allows to use global context to create composite fields [7](#composite)
|
34
36
|
* merges values if the key already exists and supports #merge [8](#merge)
|
35
37
|
* replaces values if the key already exists and doesn't support #merge [9](#replace)
|
36
38
|
* allows to assign static defaults through lambdas [10](#defaults)
|
37
39
|
* allows to remap to the deep values within the context [11](#deep)
|
38
|
-
* allows to create completely new keys [12](#new_keys)
|
40
|
+
* allows to create completely new keys (including nested ones) [12](#new_keys)
|
39
41
|
|
40
42
|
## Usage
|
41
43
|
|
42
44
|
```rb
|
43
45
|
# Having such a Hash
|
44
46
|
original_hash = {
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
47
|
+
test: 42,
|
48
|
+
'data' => [
|
49
|
+
1,
|
50
|
+
2,
|
51
|
+
'string!'
|
52
|
+
],
|
53
|
+
ignore: :me,
|
54
|
+
nested: {
|
55
|
+
hash: :data,
|
56
|
+
really: {
|
57
|
+
deep: true
|
58
|
+
}
|
59
|
+
},
|
60
|
+
recursive: [
|
61
|
+
{ number: 21 },
|
62
|
+
{ number: 42 },
|
63
|
+
{ test: 13 }
|
64
|
+
]
|
57
65
|
}
|
58
|
-
}
|
59
66
|
```
|
60
67
|
|
61
68
|
## 0: Basic Idea
|
@@ -87,6 +94,7 @@ HashRemapper.remap(
|
|
87
94
|
# data: [1, 2, 'string!'],
|
88
95
|
# dont_ignore: :me,
|
89
96
|
# internal: { hash: :data, really: { deep: true } },
|
97
|
+
# recursive: [ { number: 21 }, { number: 42 }, { test: 13 } ]
|
90
98
|
# }
|
91
99
|
```
|
92
100
|
|
@@ -115,6 +123,7 @@ HashRemapper.remap(
|
|
115
123
|
# :ignore => :me,
|
116
124
|
# :magic_number => 42,
|
117
125
|
# :nested => {:hash=>:data, :really=>{:deep=>true}}
|
126
|
+
# :recursive => [ { number: 21 }, { number: 42 }, { test: 13 } ]
|
118
127
|
# }
|
119
128
|
```
|
120
129
|
|
@@ -160,7 +169,7 @@ HashRemapper.remap(
|
|
160
169
|
# }
|
161
170
|
```
|
162
171
|
|
163
|
-
## <a name="originals">6</a>: Include data with the original
|
172
|
+
## <a name="originals">6</a>: Include data with the original key name
|
164
173
|
|
165
174
|
```rb
|
166
175
|
HashRemapper.remap(
|
@@ -237,18 +246,29 @@ HashRemapper.remap(
|
|
237
246
|
## <a name="deep">11</a>: Remap to the deep values
|
238
247
|
|
239
248
|
```rb
|
249
|
+
# INFO: For advanced usage see the specs!
|
240
250
|
HashRemapper.remap(
|
241
251
|
original_hash,
|
242
|
-
test: [:magic_bool,
|
252
|
+
test: [:magic_bool, { path: 'nested.really.deep' }]]
|
243
253
|
)
|
244
254
|
|
245
255
|
# =>
|
246
256
|
# {
|
247
257
|
# magic_bool: true
|
248
258
|
# }
|
259
|
+
|
260
|
+
HashRemapper.remap(
|
261
|
+
original_hash,
|
262
|
+
test: [:magic_numbers, {path: 'recursive.*.number', strict: false}]]
|
263
|
+
)
|
264
|
+
|
265
|
+
# =>
|
266
|
+
# {
|
267
|
+
# magic_numbers: [21, 42, nil]
|
268
|
+
# }
|
249
269
|
```
|
250
270
|
|
251
|
-
## <a name="new_keys">12</a>: Create completely new keys
|
271
|
+
## <a name="new_keys">12</a>: Create completely new keys (including nested ones)
|
252
272
|
|
253
273
|
```rb
|
254
274
|
HashRemapper.remap(
|
@@ -262,8 +282,60 @@ HashRemapper.remap(
|
|
262
282
|
# magic_number: 42,
|
263
283
|
# absolutely_new_key: 'shiny new value'
|
264
284
|
# }
|
285
|
+
|
286
|
+
HashRemapper.remap(
|
287
|
+
original_hash,
|
288
|
+
_: [[:nested, :new, :key], :test]
|
289
|
+
)
|
290
|
+
|
291
|
+
# =>
|
292
|
+
# {
|
293
|
+
# nested: {
|
294
|
+
# new: {
|
295
|
+
# key: 42
|
296
|
+
# }
|
297
|
+
# }
|
298
|
+
# }
|
299
|
+
|
300
|
+
|
301
|
+
# mapping a deep target from a deep source (BEWARE an old digging API <= v0.1.0)
|
302
|
+
HashRemapper.remap(
|
303
|
+
original_hash,
|
304
|
+
_: [[:nested, :new, :key], [:nested, :really, :deep]]
|
305
|
+
)
|
306
|
+
|
307
|
+
# =>
|
308
|
+
# {
|
309
|
+
# nested: {
|
310
|
+
# new: {
|
311
|
+
# key: true
|
312
|
+
# }
|
313
|
+
# }
|
314
|
+
# }
|
315
|
+
|
316
|
+
|
317
|
+
# mapping a deep target from a deep source (new digging API >= v0.2.0)
|
318
|
+
HashRemapper.remap(
|
319
|
+
original_hash,
|
320
|
+
_: [[:new, :deeply, :nested, :value], {path: 'recursive.*.number', strict: false, default: 3.14}]
|
321
|
+
)
|
322
|
+
|
323
|
+
# =>
|
324
|
+
# {
|
325
|
+
# new: {
|
326
|
+
# deeply: {
|
327
|
+
# nested: {
|
328
|
+
# value: [21, 42, 3.14]
|
329
|
+
# }
|
330
|
+
# }
|
331
|
+
# }
|
332
|
+
# }
|
265
333
|
```
|
266
334
|
|
335
|
+
## Examples
|
336
|
+
|
337
|
+
For advanced usage and examples see [specs](./spec/hash_remapper_spec.rb) and [examples](./exmaples)
|
338
|
+
|
267
339
|
## Development
|
268
340
|
|
269
341
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
@@ -272,9 +344,9 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
|
|
272
344
|
|
273
345
|
## Contributing
|
274
346
|
|
275
|
-
|
347
|
+
Initial version of this lib was written in pair with [@bronislav](https://github.com/bronislav), so thank him for the invaluable contribution and help.
|
276
348
|
|
277
|
-
|
349
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/smileart/hash_remapper. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
|
278
350
|
|
279
351
|
## License
|
280
352
|
|
@@ -282,4 +354,4 @@ The gem is available as open source under the terms of the [MIT License](http://
|
|
282
354
|
|
283
355
|
## Code of Conduct
|
284
356
|
|
285
|
-
Everyone interacting in the HashRemapper project’s
|
357
|
+
Everyone interacting in the HashRemapper project’s codebase, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/smileart/hash_remapper/blob/master/CODE_OF_CONDUCT.md).
|
@@ -0,0 +1,100 @@
|
|
1
|
+
require 'hash_digger'
|
2
|
+
require 'hash_remapper'
|
3
|
+
require 'tapp'
|
4
|
+
|
5
|
+
data = {
|
6
|
+
:books => [
|
7
|
+
{
|
8
|
+
:title => "The Hitchhiker's Guide to the Galaxy",
|
9
|
+
:editions => [
|
10
|
+
{
|
11
|
+
:isbn => "978-1-9936-7490-4",
|
12
|
+
:language => "en",
|
13
|
+
:pages => 193,
|
14
|
+
:genres => [
|
15
|
+
"comic",
|
16
|
+
"science fiction"
|
17
|
+
]
|
18
|
+
},
|
19
|
+
{
|
20
|
+
:isbn => "978-0-5762-2634-9",
|
21
|
+
:language => "en",
|
22
|
+
:pages => 208,
|
23
|
+
:genres => [
|
24
|
+
"comic",
|
25
|
+
"fiction",
|
26
|
+
"science fiction"
|
27
|
+
]
|
28
|
+
},
|
29
|
+
{
|
30
|
+
:isbn => "978-5-4566-1998-3",
|
31
|
+
:language => "de",
|
32
|
+
:pages => 232,
|
33
|
+
:genres => [
|
34
|
+
"fiction",
|
35
|
+
"science fiction"
|
36
|
+
]
|
37
|
+
}
|
38
|
+
]
|
39
|
+
},
|
40
|
+
{
|
41
|
+
:title => "To Kill a Mockingbird",
|
42
|
+
:editions => [
|
43
|
+
{
|
44
|
+
:isbn => "978-4-0125-2865-3",
|
45
|
+
:language => "en",
|
46
|
+
:pages => 324,
|
47
|
+
:genres => [
|
48
|
+
"Southern Gothic",
|
49
|
+
"Bildungsroman"
|
50
|
+
]
|
51
|
+
},
|
52
|
+
{
|
53
|
+
:isbn => "978-5-3638-3280-2",
|
54
|
+
:language => "en",
|
55
|
+
:pages => 324,
|
56
|
+
:genres => [
|
57
|
+
"magic realism"
|
58
|
+
]
|
59
|
+
}
|
60
|
+
]
|
61
|
+
}
|
62
|
+
]
|
63
|
+
}
|
64
|
+
|
65
|
+
puts "Here we lose the relations between books and ISBNs:"
|
66
|
+
raw_result = HashRemapper.remap(
|
67
|
+
data,
|
68
|
+
titles: [:titles, { path: 'books.*.title' }],
|
69
|
+
isbns: [:isbns, { path: 'books.*.editions.*.*.isbn' }]
|
70
|
+
).tapp
|
71
|
+
|
72
|
+
puts '='*50
|
73
|
+
puts
|
74
|
+
|
75
|
+
puts "Here we do a little trick splitting the path into two parts to presev relation in indexes"
|
76
|
+
isbn_result = HashRemapper.remap(
|
77
|
+
data,
|
78
|
+
titles: [:titles, { path: 'books.*.title' }],
|
79
|
+
isbns: [:isbns, { path: 'books.*.editions.*', lambda: ->(editions) { editions.collect { |edition| HashDigger::Digger.dig(data: edition, path: '*.isbn') } } }]
|
80
|
+
).tapp
|
81
|
+
|
82
|
+
puts '='*50
|
83
|
+
puts
|
84
|
+
|
85
|
+
puts "Then we zip the data together in key => value format:"
|
86
|
+
Hash[isbn_result[:titles].zip(isbn_result[:isbns])].tapp
|
87
|
+
|
88
|
+
puts '='*50
|
89
|
+
puts ''
|
90
|
+
|
91
|
+
puts "Or create the new hashes assebling the data in any desirable structure:"
|
92
|
+
books_with_isbns = []
|
93
|
+
isbn_result[:titles].each_with_index do |t, i|
|
94
|
+
books_with_isbns << {
|
95
|
+
title: t,
|
96
|
+
isbns: isbn_result[:isbns][i].uniq
|
97
|
+
}
|
98
|
+
end
|
99
|
+
|
100
|
+
books_with_isbns.tapp
|
data/exmaples/weather.rb
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'json'
|
2
|
+
require_relative '../lib/hash_remapper'
|
3
|
+
|
4
|
+
# https://samples.openweathermap.org/data/2.5/weather?q=London,uk&appid=b6907d289e10d714a6e88b30761fae22
|
5
|
+
weather = JSON.parse('{"coord":{"lon":-0.13,"lat":51.51},"weather":[{"id":300,"main":"Drizzle","description":"light intensity drizzle","icon":"09d"}],"base":"stations","main":{"temp":280.32,"pressure":1012,"humidity":81,"temp_min":279.15,"temp_max":281.15},"visibility":10000,"wind":{"speed":4.1,"deg":80},"clouds":{"all":90},"dt":1485789600,"sys":{"type":1,"id":5091,"message":0.0103,"country":"GB","sunrise":1485762037,"sunset":1485794875},"id":2643743,"name":"London","cod":200}')
|
6
|
+
|
7
|
+
k_to_c = ->(kelvin) { "#{(kelvin - 273.15).floor}˚C" } # notice the difference with the next example
|
8
|
+
|
9
|
+
remapped_weather = HashRemapper.remap(
|
10
|
+
weather,
|
11
|
+
# deep keys creation instead of automerge
|
12
|
+
_conditions: [[:current_conditions, :description], {path: 'weather.0', lambda: ->(res){ "#{res[:description]}".capitalize }} ],
|
13
|
+
_temperature: [[:current_conditions, :temperature], {path: 'main.temp', lambda: k_to_c}],
|
14
|
+
|
15
|
+
_clouds: [[:clouds_coverage, :percentage], {path: 'clouds.all'}],
|
16
|
+
'visibility' => ->(vis, _) { [:visibility, "#{vis / 1000}km"] },
|
17
|
+
['sys', 'country'] => ->(country, _) { [[:place, :country], country] },
|
18
|
+
'name' => ->(city, _) { [[:place, :city], city] },
|
19
|
+
'coord' => :geo_coordinates
|
20
|
+
)
|
21
|
+
|
22
|
+
p remapped_weather
|
23
|
+
|
24
|
+
# =================================================================================================================================
|
25
|
+
|
26
|
+
k_to_c = ->(kelvin) { { temperature: "#{(kelvin - 273.15).floor}˚C" } } # notice the difference with the previous example
|
27
|
+
|
28
|
+
remapped_weather = HashRemapper.remap(
|
29
|
+
weather,
|
30
|
+
# automerge on "conflict"
|
31
|
+
_conditions: [:current_conditions, {path: 'weather.0', lambda: ->(res){ { description: "#{res[:description]}".capitalize }}} ],
|
32
|
+
_temperature: [:current_conditions, {path: 'main.temp', lambda: k_to_c}], # automerge
|
33
|
+
_clouds: [[:clouds_coverage, :percentage], {path: 'clouds.all'}],
|
34
|
+
'visibility' => ->(vis, _) { [:visibility, "#{vis / 1000}km"] },
|
35
|
+
['sys', 'country'] => ->(country, _) { [[:place, :country], country] },
|
36
|
+
'name' => ->(city, _) { [[:place, :city], city] },
|
37
|
+
|
38
|
+
# notice the nested HashRemapper (alternatively https://devdocs.io/rails~5.0/hash#method-i-deep_symbolize_keys could be used on overall result)
|
39
|
+
'coord' => ->(coord, _) { [:geo_coordinates, HashRemapper.remap(coord, 'lon' => :lon, 'lat' => :lat)] },
|
40
|
+
)
|
41
|
+
|
42
|
+
p remapped_weather
|
data/hash_remapper.gemspec
CHANGED
@@ -3,9 +3,10 @@
|
|
3
3
|
|
4
4
|
lib = File.expand_path('../lib', __FILE__)
|
5
5
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
6
|
-
require 'hash_remapper'
|
7
6
|
|
8
|
-
|
7
|
+
require 'hash_remapper/version'
|
8
|
+
|
9
|
+
HashRemapper::GEMSPEC = Gem::Specification.new do |spec|
|
9
10
|
spec.name = 'hash_remapper'
|
10
11
|
spec.version = HashRemapper::VERSION
|
11
12
|
spec.authors = ['Serge Bedzhyk']
|
@@ -13,24 +14,27 @@ Gem::Specification.new do |spec|
|
|
13
14
|
|
14
15
|
spec.summary = 'A little lib which maps original keys to the new ones'
|
15
16
|
spec.description = 'A little lib which maps original keys to the new ones and more'
|
16
|
-
spec.homepage = 'https://
|
17
|
+
spec.homepage = 'https://github.com/smileart/hash_remapper'
|
17
18
|
spec.license = 'MIT'
|
18
19
|
|
19
20
|
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
20
21
|
f.match(%r{^(test|spec|features)/})
|
21
22
|
end
|
23
|
+
|
22
24
|
spec.bindir = 'exe'
|
23
25
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
24
26
|
spec.require_paths = ['lib']
|
25
27
|
|
26
|
-
spec.
|
27
|
-
|
28
|
-
spec.add_development_dependency '
|
29
|
-
spec.add_development_dependency '
|
30
|
-
spec.add_development_dependency '
|
31
|
-
spec.add_development_dependency '
|
32
|
-
spec.add_development_dependency '
|
28
|
+
spec.add_dependency 'hash_digger', '~> 0.1'
|
29
|
+
|
30
|
+
spec.add_development_dependency 'bundler', '~> 2.1'
|
31
|
+
spec.add_development_dependency 'byebug', '~> 11.1'
|
32
|
+
spec.add_development_dependency 'inch', '>= 0.9.0.rc1'
|
33
|
+
spec.add_development_dependency 'rake', '~> 13.0'
|
34
|
+
spec.add_development_dependency 'rspec', '~> 3.9'
|
35
|
+
spec.add_development_dependency 'rubocop', '~> 0.91'
|
33
36
|
spec.add_development_dependency 'rubygems-tasks', '~> 0.2'
|
34
|
-
spec.add_development_dependency 'simplecov', '~> 0.
|
35
|
-
spec.add_development_dependency '
|
37
|
+
spec.add_development_dependency 'simplecov', '~> 0.19'
|
38
|
+
spec.add_development_dependency 'tapp', '~> 1.5'
|
39
|
+
spec.add_development_dependency 'yard', '~> 0.9'
|
36
40
|
end
|
data/lib/hash_remapper.rb
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'set'
|
4
|
+
require 'hash_digger'
|
5
|
+
|
6
|
+
require 'tapp' if ENV['DEBUG']
|
7
|
+
require 'byebug' if ENV['DEBUG']
|
4
8
|
|
5
9
|
# Utility class to map original Hash keys to the new ones
|
6
10
|
class HashRemapper
|
7
|
-
# Current Library Version
|
8
|
-
VERSION = '0.1.0'
|
9
|
-
|
10
11
|
class << self
|
11
12
|
# Remaps `data` Hash by renaming keys, creating new ones and
|
12
13
|
# optionally aggregating values
|
@@ -21,19 +22,20 @@ class HashRemapper
|
|
21
22
|
#
|
22
23
|
# @param [Hash] data the original Hash to remap
|
23
24
|
# @param [Boolean] pass_trough the flag to pass the original key/value pairs (default: false)
|
24
|
-
# @param [Hash] mapping the Hash which in the simplest case tells how to rename keys
|
25
|
+
# @param [Hash] mapping the Hash which in the simplest case tells how to rename keys (source: :target)
|
25
26
|
#
|
26
27
|
# @return [Hash] remapped version of the original Hash
|
27
28
|
# (selected keys only or all the keys if we passed originals)
|
28
29
|
def remap(data, pass_trough = false, mapping)
|
29
30
|
mapping = pass_trough_mapping(data, mapping) if pass_trough
|
30
31
|
|
31
|
-
mapping.each_with_object({}) do |(from, to), acc|
|
32
|
+
mapping.each_with_object(Hash.new { |hash, key| hash[key] = Hash.new(&hash.default_proc) }) do |(from, to), acc|
|
32
33
|
key, value = try_callable(from, to, data, acc) ||
|
33
|
-
try_digging(to, data) ||
|
34
|
+
try_digging(from, to, data, acc) ||
|
35
|
+
try_nesting(from, to, data, acc) ||
|
34
36
|
[to, data[from]]
|
35
37
|
|
36
|
-
acc
|
38
|
+
set_value(acc, key, value)
|
37
39
|
acc
|
38
40
|
end
|
39
41
|
end
|
@@ -52,26 +54,56 @@ class HashRemapper
|
|
52
54
|
def try_callable(from, to, data, acc)
|
53
55
|
return unless to.respond_to?(:call)
|
54
56
|
|
55
|
-
target_name, target_data = to.call(data
|
57
|
+
target_name, target_data = to.call(data.dig(*from), data)
|
56
58
|
|
57
|
-
|
58
|
-
|
59
|
-
|
59
|
+
target_data = acc.dig(*target_name).respond_to?(:merge) && target_data.respond_to?(:merge) ?
|
60
|
+
acc.dig(*target_name).merge(target_data) :
|
61
|
+
target_data
|
60
62
|
|
61
63
|
[target_name, target_data]
|
62
64
|
end
|
63
65
|
|
64
66
|
# Method to try to handle data digging
|
65
67
|
# (if the mapping value is enumerable)
|
68
|
+
# @see https://github.com/smileart/hash_digger
|
66
69
|
#
|
67
|
-
# @param [
|
70
|
+
# @param [Array] to the target key to map to ([new_key, {path: 'a.*.b', strict: false, lambda: ->(res){ … }}])
|
68
71
|
# @param [Hash] data the whole original Hash to use as the digging target
|
69
72
|
#
|
70
73
|
# @return [Array(Object,Object)] key and its value to put to the resulting Hash
|
71
|
-
def try_digging(to, data)
|
74
|
+
def try_digging(_from, to, data, acc)
|
72
75
|
return unless to.respond_to?(:each)
|
73
76
|
|
74
|
-
|
77
|
+
digger_args = to.fetch(1)
|
78
|
+
|
79
|
+
# v0.1.0 backward compartability layer ([new_key, [:digg, :path, :keys]])
|
80
|
+
return [to.first, data.dig(*to.last)] if digger_args.kind_of?(Array)
|
81
|
+
return unless digger_args.respond_to?(:fetch)
|
82
|
+
|
83
|
+
lambda = digger_args.fetch(:lambda) { nil }
|
84
|
+
|
85
|
+
# @see https://github.com/DamirSvrtan/fasterer — fetch_with_argument_vs_block
|
86
|
+
# @see https://github.com/smileart/hash_digger — digger args
|
87
|
+
target_name = to.fetch(0)
|
88
|
+
|
89
|
+
source_data = HashDigger::Digger.dig(
|
90
|
+
data: data,
|
91
|
+
path: digger_args.fetch(:path) { '*' },
|
92
|
+
strict: digger_args.fetch(:strict) { true },
|
93
|
+
default: digger_args.fetch(:default) { nil },
|
94
|
+
&lambda
|
95
|
+
)
|
96
|
+
|
97
|
+
return [
|
98
|
+
target_name,
|
99
|
+
acc.dig(*target_name).respond_to?(:merge) && source_data.respond_to?(:merge) ?
|
100
|
+
acc.dig(*target_name).merge(source_data) :
|
101
|
+
source_data
|
102
|
+
]
|
103
|
+
end
|
104
|
+
|
105
|
+
def try_nesting(_from, to, data, _acc)
|
106
|
+
[to.fetch(0), data[to.fetch(1)]] if to.respond_to?(:fetch)
|
75
107
|
end
|
76
108
|
|
77
109
|
# Method which automatically prepares direct mapping (e.g. { :a => :a })
|
@@ -90,5 +122,16 @@ class HashRemapper
|
|
90
122
|
|
91
123
|
mapping.merge(pass_trough_mapping)
|
92
124
|
end
|
125
|
+
|
126
|
+
def set_value(data, key, value)
|
127
|
+
unless key.respond_to?(:each)
|
128
|
+
data[key] = value
|
129
|
+
return data
|
130
|
+
end
|
131
|
+
|
132
|
+
last_key = key.pop
|
133
|
+
|
134
|
+
data.dig(*key)[last_key] = value
|
135
|
+
end
|
93
136
|
end
|
94
137
|
end
|
metadata
CHANGED
@@ -1,113 +1,113 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hash_remapper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Serge Bedzhyk
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-09-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: hash_digger
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '1
|
20
|
-
type: :
|
19
|
+
version: '0.1'
|
20
|
+
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '1
|
26
|
+
version: '0.1'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: bundler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '2.1'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '2.1'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: byebug
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '11.1'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
54
|
+
version: '11.1'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
56
|
+
name: inch
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- - "
|
59
|
+
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
61
|
+
version: 0.9.0.rc1
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- - "
|
66
|
+
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
68
|
+
version: 0.9.0.rc1
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: rake
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
73
|
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: '
|
75
|
+
version: '13.0'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: '
|
82
|
+
version: '13.0'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: rspec
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
87
|
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: '3.
|
89
|
+
version: '3.9'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: '3.
|
96
|
+
version: '3.9'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: rubocop
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
101
|
- - "~>"
|
102
102
|
- !ruby/object:Gem::Version
|
103
|
-
version: '0.
|
103
|
+
version: '0.91'
|
104
104
|
type: :development
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
108
|
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
|
-
version: '0.
|
110
|
+
version: '0.91'
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
112
|
name: rubygems-tasks
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
@@ -128,28 +128,42 @@ dependencies:
|
|
128
128
|
requirements:
|
129
129
|
- - "~>"
|
130
130
|
- !ruby/object:Gem::Version
|
131
|
-
version: '0.
|
131
|
+
version: '0.19'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - "~>"
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0.19'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: tapp
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - "~>"
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '1.5'
|
132
146
|
type: :development
|
133
147
|
prerelease: false
|
134
148
|
version_requirements: !ruby/object:Gem::Requirement
|
135
149
|
requirements:
|
136
150
|
- - "~>"
|
137
151
|
- !ruby/object:Gem::Version
|
138
|
-
version: '
|
152
|
+
version: '1.5'
|
139
153
|
- !ruby/object:Gem::Dependency
|
140
154
|
name: yard
|
141
155
|
requirement: !ruby/object:Gem::Requirement
|
142
156
|
requirements:
|
143
157
|
- - "~>"
|
144
158
|
- !ruby/object:Gem::Version
|
145
|
-
version: '0.
|
159
|
+
version: '0.9'
|
146
160
|
type: :development
|
147
161
|
prerelease: false
|
148
162
|
version_requirements: !ruby/object:Gem::Requirement
|
149
163
|
requirements:
|
150
164
|
- - "~>"
|
151
165
|
- !ruby/object:Gem::Version
|
152
|
-
version: '0.
|
166
|
+
version: '0.9'
|
153
167
|
description: A little lib which maps original keys to the new ones and more
|
154
168
|
email: smileart21@gmail.com
|
155
169
|
executables: []
|
@@ -168,10 +182,13 @@ files:
|
|
168
182
|
- Rakefile
|
169
183
|
- bin/console
|
170
184
|
- bin/setup
|
185
|
+
- exmaples/relations.rb
|
186
|
+
- exmaples/weather.rb
|
171
187
|
- hash_remapper.gemspec
|
172
188
|
- img/hash_remapper.png
|
173
189
|
- lib/hash_remapper.rb
|
174
|
-
|
190
|
+
- lib/hash_remapper/version.rb
|
191
|
+
homepage: https://github.com/smileart/hash_remapper
|
175
192
|
licenses:
|
176
193
|
- MIT
|
177
194
|
metadata: {}
|
@@ -190,8 +207,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
190
207
|
- !ruby/object:Gem::Version
|
191
208
|
version: '0'
|
192
209
|
requirements: []
|
193
|
-
|
194
|
-
rubygems_version: 2.6.14
|
210
|
+
rubygems_version: 3.1.2
|
195
211
|
signing_key:
|
196
212
|
specification_version: 4
|
197
213
|
summary: A little lib which maps original keys to the new ones
|