hash_remapper 0.1.0 → 0.4.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: fbfe47cb8ee736cddb808ede7db0b136fcf8f07d
4
- data.tar.gz: bbf5f08842c8d821332f2085dbef2c7f6560d396
2
+ SHA256:
3
+ metadata.gz: 849f5ac471d049fc5ed4dccb35a3dc583cc326b94196378db5444a6ce6d7c7e5
4
+ data.tar.gz: caebef5d5546e43484ace97d07e9b8a3c719a11d033b6936d9c2e67be0534a41
5
5
  SHA512:
6
- metadata.gz: c80302b1468b4b300c99bd281022b282863d059d0d4fdc4e758213c42fc00473022768d1358743dbb78cdd32ac81c36c17dda1995115b6577294f7e0dde83838
7
- data.tar.gz: 76d4c1d617e18f89240ff75b3e107aaaab466e5082a00362eaf4fd8d05244dfa8069019b7c3ae68748bec6923b31b955962d214431b858a546e77a9df3c9bac9
6
+ metadata.gz: 467c6ab818803bf1ac8f7c252ed60bf0ce9b02926cae155aa21cd1689aa5c05e6926716293ad45ba8c74190c6aa7b8221a7ad6658ac47394f41faefcd1369e62
7
+ data.tar.gz: 90897ecf9b5bdc3bb6ee6b60c09721a9f0a5236fd2e5f5bc4d03580beb83a337a8e36f94e0294ea8005fe0eee26a20dfc5521f43502d10a8f8ebeef73a8f58ee
data/.gitignore CHANGED
@@ -86,3 +86,6 @@ Session.vim
86
86
  *~
87
87
  # auto-generated tag files
88
88
  tags
89
+
90
+ ### vscode ###
91
+ .vscode
@@ -1,5 +1,5 @@
1
1
  sudo: false
2
2
  language: ruby
3
3
  rvm:
4
- - 2.4.1
5
- before_install: gem install bundler -v 1.16
4
+ - 2.6.0
5
+ before_install: gem install bundler -v 2.0.1
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
+ > [![Build Status](https://travis-ci.org/smileart/hash_remapper.svg?branch=master)](https://travis-ci.org/smileart/hash_remapper) ![Gem](https://img.shields.io/gem/v/hash_remapper.svg)
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
- * preprocesses the value with a lambda [3](#lambda)
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 keynames [6](#originals)
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
- test: 42,
46
- 'data' => [
47
- 1,
48
- 2,
49
- 'string!'
50
- ],
51
- ignore: :me,
52
- nested: {
53
- hash: :data,
54
- really: {
55
- deep: true
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 keyname
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, %i[nested really deep]]
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
- Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/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.
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
- Initial version of this lib was written in pair with @bronislav, so thank him for invaluabale contribution and help.
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 codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/[USERNAME]/hash_remapper/blob/master/CODE_OF_CONDUCT.md).
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
@@ -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
@@ -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
- Gem::Specification.new do |spec|
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://rubygems.org/gems/hash_remapper'
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.add_development_dependency 'bundler', '~> 1.16'
27
- spec.add_development_dependency 'byebug', '~> 9.1'
28
- spec.add_development_dependency 'inch', '~> 0.7'
29
- spec.add_development_dependency 'letters', '~> 0.4'
30
- spec.add_development_dependency 'rake', '~> 12.2'
31
- spec.add_development_dependency 'rspec', '~> 3.7'
32
- spec.add_development_dependency 'rubocop', '~> 0.51'
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.15'
35
- spec.add_development_dependency 'yard', '~> 0.8'
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
@@ -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[key] = value
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[from], data)
57
+ target_name, target_data = to.call(data.dig(*from), data)
56
58
 
57
- if acc.key?(target_name) && acc[target_name].respond_to?(:merge)
58
- target_data = acc[target_name].merge(target_data)
59
- end
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 [Object] to the target key to map to
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
- [to.first, data.dig(*to.last)]
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
@@ -0,0 +1,4 @@
1
+ class HashRemapper
2
+ # Current Library Version
3
+ VERSION = '0.4.3'
4
+ 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.1.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: 2017-12-05 00:00:00.000000000 Z
11
+ date: 2020-09-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: bundler
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.16'
20
- type: :development
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.16'
26
+ version: '0.1'
27
27
  - !ruby/object:Gem::Dependency
28
- name: byebug
28
+ name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '9.1'
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: '9.1'
40
+ version: '2.1'
41
41
  - !ruby/object:Gem::Dependency
42
- name: inch
42
+ name: byebug
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '0.7'
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: '0.7'
54
+ version: '11.1'
55
55
  - !ruby/object:Gem::Dependency
56
- name: letters
56
+ name: inch
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - "~>"
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
- version: '0.4'
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: '0.4'
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: '12.2'
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: '12.2'
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.7'
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.7'
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.51'
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.51'
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.15'
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: '0.15'
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.8'
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.8'
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
- homepage: https://rubygems.org/gems/hash_remapper
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
- rubyforge_project:
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