hm 0.0.1 → 0.0.2
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 +11 -0
- data/README.md +1 -0
- data/lib/hm.rb +2 -0
- data/lib/hm/algo.rb +19 -25
- data/lib/hm/dig.rb +19 -0
- data/lib/hm/version.rb +7 -0
- metadata +20 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 546509d780fa20ac838d7cde7df190a5860df261
|
4
|
+
data.tar.gz: cd18bb35c606420e79056efebd703e5bd9c3962d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 16c5155264b15632a58896c8e8acd5e26ed10b579bc813e66b4256ae03bfd7ee61a1fd2d702cef0aeda82a9011e193618c4ab00f98c270ff293564d81da82523
|
7
|
+
data.tar.gz: fa1a5b8e97a2a27bb9ab97f156f33d43746301d8b236488c8ea669d7b19c7cffebc80a132cd3a8fb636d159d1940240f2cbaa371cead7b558eb45956f7dd5e95
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
# Hm version history
|
2
|
+
|
3
|
+
## 0.0.2 - Feb 24, 2018
|
4
|
+
|
5
|
+
* Some profiling and small optimizations;
|
6
|
+
* Support for Ruby versions before 2.3, when native #dig was introduced, thanks to
|
7
|
+
[@berniechiu](https://github.com/berniechiu).
|
8
|
+
|
9
|
+
## 0.0.1 - Feb 17, 2018
|
10
|
+
|
11
|
+
Initial
|
data/README.md
CHANGED
@@ -73,6 +73,7 @@ pp Hm.new(weather)
|
|
73
73
|
invented on the road, but may not work for yours;
|
74
74
|
* Most of the methods work on Arrays and Hashes, but not on `Struct` and `OpenStruct` (which are
|
75
75
|
`dig`-able in Ruby), though, base `#dig` and `#dig!` should work on them too;
|
76
|
+
* `Hm(hash).dig(...)` works even on versions of Ruby before 2.3 (when native `#dig` was introduced);
|
76
77
|
* API is subject to polish and change in future.
|
77
78
|
|
78
79
|
## Usage
|
data/lib/hm.rb
CHANGED
data/lib/hm/algo.rb
CHANGED
@@ -24,31 +24,25 @@ class Hm
|
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
27
|
-
|
28
|
-
case
|
29
|
-
when collection.respond_to?(:each_pair)
|
30
|
-
collection.each_pair.to_a
|
31
|
-
when collection.respond_to?(:each)
|
32
|
-
collection.each_with_index.to_a.map(&:reverse)
|
33
|
-
else
|
34
|
-
fail TypeError, "Can't dig/* in #{collection.class}"
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
# Enumerates through entire collection with "current key/current values" at each point, even
|
27
|
+
# Enumerates through entire collection with "current key/current value" at each point, even
|
39
28
|
# if elements are deleted in a process of enumeration
|
40
29
|
def robust_enumerator(collection)
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
30
|
+
case collection
|
31
|
+
when Hash, Struct
|
32
|
+
collection.each_pair.to_a
|
33
|
+
when Array
|
34
|
+
Enumerator.new do |y|
|
35
|
+
cur = collection.size
|
36
|
+
until cur.zero?
|
37
|
+
pos = collection.size - cur
|
38
|
+
y << [pos, collection[pos]]
|
39
|
+
cur -= 1
|
40
|
+
end
|
51
41
|
end
|
42
|
+
when ->(c) { c.respond_to?(:each_pair) }
|
43
|
+
collection.each_pair.to_a
|
44
|
+
else
|
45
|
+
fail TypeError, "Can't dig/* in #{collection.class}"
|
52
46
|
end
|
53
47
|
end
|
54
48
|
|
@@ -60,7 +54,7 @@ class Hm
|
|
60
54
|
end
|
61
55
|
|
62
56
|
def visit(what, rest, path = [], not_found: ->(*) {}, &found)
|
63
|
-
|
57
|
+
Dig.diggable?(what) or fail TypeError, "#{what.class} is not diggable"
|
64
58
|
|
65
59
|
key, *rst = rest
|
66
60
|
if key == WILDCARD
|
@@ -73,7 +67,7 @@ class Hm
|
|
73
67
|
def visit_all(what, path = [], &block)
|
74
68
|
robust_enumerator(what).each do |key, val|
|
75
69
|
yield(what, [*path, key], val)
|
76
|
-
visit_all(val, [*path, key], &block) if
|
70
|
+
visit_all(val, [*path, key], &block) if Dig.diggable?(val)
|
77
71
|
end
|
78
72
|
end
|
79
73
|
|
@@ -87,7 +81,7 @@ class Hm
|
|
87
81
|
end
|
88
82
|
|
89
83
|
def visit_regular(what, key, rest, path, found:, not_found:) # rubocop:disable Metrics/ParameterLists
|
90
|
-
internal =
|
84
|
+
internal = Dig.dig(what, key) or return not_found.(what, [*path, key], rest)
|
91
85
|
rest.empty? and return found.(what, [*path, key], internal)
|
92
86
|
visit(internal, rest, [*path, key], not_found: not_found, &found)
|
93
87
|
end
|
data/lib/hm/dig.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
class Hm
|
2
|
+
# @private
|
3
|
+
module Dig
|
4
|
+
# TODO: Struct/OpenStruct are also diggable in Ruby core, can be added for future implementation
|
5
|
+
DIGGABLE_CLASSES = [Hash, Array].freeze
|
6
|
+
|
7
|
+
def self.dig(what, *keys)
|
8
|
+
return what.dig(*keys) if what.respond_to?(:dig)
|
9
|
+
|
10
|
+
diggable?(what) or fail TypeError, "#{value.class} is not diggable"
|
11
|
+
value = what[keys.shift]
|
12
|
+
value.nil? || keys.empty? ? value : dig(value, *keys)
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.diggable?(what)
|
16
|
+
DIGGABLE_CLASSES.include?(what.class)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/lib/hm/version.rb
ADDED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Victor Shepelev
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-02-
|
11
|
+
date: 2018-02-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: yard
|
@@ -178,6 +178,20 @@ dependencies:
|
|
178
178
|
- - ">="
|
179
179
|
- !ruby/object:Gem::Version
|
180
180
|
version: '0'
|
181
|
+
- !ruby/object:Gem::Dependency
|
182
|
+
name: ruby-prof
|
183
|
+
requirement: !ruby/object:Gem::Requirement
|
184
|
+
requirements:
|
185
|
+
- - ">="
|
186
|
+
- !ruby/object:Gem::Version
|
187
|
+
version: '0'
|
188
|
+
type: :development
|
189
|
+
prerelease: false
|
190
|
+
version_requirements: !ruby/object:Gem::Requirement
|
191
|
+
requirements:
|
192
|
+
- - ">="
|
193
|
+
- !ruby/object:Gem::Version
|
194
|
+
version: '0'
|
181
195
|
description: |2
|
182
196
|
Hm is a library for clean, idiomatic and chainable processing of complicated Ruby structures,
|
183
197
|
typically unpacked from JSON. It provides smart dig and bury, keys replacement,
|
@@ -187,10 +201,13 @@ executables: []
|
|
187
201
|
extensions: []
|
188
202
|
extra_rdoc_files: []
|
189
203
|
files:
|
204
|
+
- CHANGELOG.md
|
190
205
|
- LICENSE.txt
|
191
206
|
- README.md
|
192
207
|
- lib/hm.rb
|
193
208
|
- lib/hm/algo.rb
|
209
|
+
- lib/hm/dig.rb
|
210
|
+
- lib/hm/version.rb
|
194
211
|
homepage: https://github.com/zverok/hm
|
195
212
|
licenses:
|
196
213
|
- MIT
|
@@ -203,7 +220,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
203
220
|
requirements:
|
204
221
|
- - ">="
|
205
222
|
- !ruby/object:Gem::Version
|
206
|
-
version: 2.
|
223
|
+
version: 2.1.0
|
207
224
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
208
225
|
requirements:
|
209
226
|
- - ">="
|