kind 3.0.1 → 3.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +67 -0
- data/lib/kind.rb +3 -1
- data/lib/kind/dig.rb +36 -0
- data/lib/kind/maybe.rb +10 -0
- data/lib/kind/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7b62da87ad8443fb4d3f1d96535bc69259addf767721db70288401d677733967
|
4
|
+
data.tar.gz: 995f0a3a34ed67a3244e181380d627e076d4576a2b6e0c7de2b34fa415c5f868
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3398bbf2b67fe8b81023d9c781b14ac115f5749f45641a74fc1ff1c8d05f4fd1c4e2a4bc817d6c71e7f8dc96b245ec9f9c80a776ae11d22ba69dbc878dfaa847
|
7
|
+
data.tar.gz: 75c6c1e387548447edf601d4b73b18ff3e2700debf3f6715b2f772f582829d39a72e7bb9d8af61fe8bcd32e9f72aa8398f1703f2c706668a0ab5e59fc0612b05
|
data/README.md
CHANGED
@@ -49,6 +49,7 @@ One of the goals of this project is to do simple type checking like `"some strin
|
|
49
49
|
- [Kind::Maybe(<Type>)](#kindmaybetype)
|
50
50
|
- [Kind::Maybe#try](#kindmaybetry)
|
51
51
|
- [Kind::Maybe#try!](#kindmaybetry-1)
|
52
|
+
- [Kind::Maybe#dig](#kindmaybedig)
|
52
53
|
- [Kind::Empty](#kindempty)
|
53
54
|
- [Similar Projects](#similar-projects)
|
54
55
|
- [Development](#development)
|
@@ -458,6 +459,7 @@ The list of types (classes and modules) available to use with `Kind.of.*` or `Ki
|
|
458
459
|
- `Kind.of.Range`
|
459
460
|
- `Kind.of.Hash`
|
460
461
|
- `Kind.of.Struct`
|
462
|
+
- `Kind.of.OpenStruct`
|
461
463
|
- `Kind.of.Enumerator`
|
462
464
|
- `Kind.of.Set`
|
463
465
|
- `Kind.of.Method`
|
@@ -1090,6 +1092,71 @@ Kind::Maybe[{}].try!(:upcase) # => NoMethodError (undefined method `upcase' for
|
|
1090
1092
|
|
1091
1093
|
[⬆️ Back to Top](#table-of-contents-)
|
1092
1094
|
|
1095
|
+
### Kind::Maybe#dig
|
1096
|
+
|
1097
|
+
Has the same behavior of Ruby dig methods ([Hash](https://ruby-doc.org/core-2.3.0/Hash.html#method-i-dig), [Array](https://ruby-doc.org/core-2.3.0/Array.html#method-i-dig), [Struct](https://ruby-doc.org/core-2.3.0/Struct.html#method-i-dig), [OpenStruct](https://ruby-doc.org/stdlib-2.3.0/libdoc/ostruct/rdoc/OpenStruct.html#method-i-dig)), but it will not raise an error if some value can't be digged.
|
1098
|
+
|
1099
|
+
```ruby
|
1100
|
+
[nil, 1, '', /x/].each do |value|
|
1101
|
+
p Kind::Maybe[value].dig(:foo).value # nil
|
1102
|
+
end
|
1103
|
+
|
1104
|
+
# --
|
1105
|
+
|
1106
|
+
a = [1, 2, 3]
|
1107
|
+
|
1108
|
+
Kind::Maybe[a].dig(0).value # 1
|
1109
|
+
|
1110
|
+
Kind::Maybe[a].dig(3).value # nil
|
1111
|
+
|
1112
|
+
# --
|
1113
|
+
|
1114
|
+
h = { foo: {bar: {baz: 1}}}
|
1115
|
+
|
1116
|
+
Kind::Maybe[h].dig(:foo).value # {bar: {baz: 1}}
|
1117
|
+
Kind::Maybe[h].dig(:foo, :bar).value # {baz: 1}
|
1118
|
+
Kind::Maybe[h].dig(:foo, :bar, :baz).value # 1
|
1119
|
+
|
1120
|
+
Kind::Maybe[h].dig(:foo, :bar, 'baz').value # nil
|
1121
|
+
|
1122
|
+
# --
|
1123
|
+
|
1124
|
+
i = { foo: [{'bar' => [1, 2]}, {baz: [3, 4]}] }
|
1125
|
+
|
1126
|
+
Kind::Maybe[i].dig(:foo, 0, 'bar', 0).value # 1
|
1127
|
+
Kind::Maybe[i].dig(:foo, 0, 'bar', 1).value # 2
|
1128
|
+
Kind::Maybe[i].dig(:foo, 0, 'bar', -1).value # 2
|
1129
|
+
|
1130
|
+
Kind::Maybe[i].dig(:foo, 0, 'bar', 2).value # nil
|
1131
|
+
|
1132
|
+
# --
|
1133
|
+
|
1134
|
+
s = Struct.new(:a, :b).new(101, 102)
|
1135
|
+
o = OpenStruct.new(c: 103, d: 104)
|
1136
|
+
b = { struct: s, ostruct: o, data: [s, o]}
|
1137
|
+
|
1138
|
+
Kind::Maybe[s].dig(:a).value # 101
|
1139
|
+
Kind::Maybe[b].dig(:struct, :b).value # 102
|
1140
|
+
Kind::Maybe[b].dig(:data, 0, :b).value # 102
|
1141
|
+
Kind::Maybe[b].dig(:data, 0, 'b').value # 102
|
1142
|
+
|
1143
|
+
Kind::Maybe[o].dig(:c).value # 103
|
1144
|
+
Kind::Maybe[b].dig(:ostruct, :d).value # 104
|
1145
|
+
Kind::Maybe[b].dig(:data, 1, :d).value # 104
|
1146
|
+
Kind::Maybe[b].dig(:data, 1, 'd').value # 104
|
1147
|
+
|
1148
|
+
Kind::Maybe[s].dig(:f).value # nil
|
1149
|
+
Kind::Maybe[o].dig(:f).value # nil
|
1150
|
+
Kind::Maybe[b].dig(:struct, :f).value # nil
|
1151
|
+
Kind::Maybe[b].dig(:ostruct, :f).value # nil
|
1152
|
+
Kind::Maybe[b].dig(:data, 0, :f).value # nil
|
1153
|
+
Kind::Maybe[b].dig(:data, 1, :f).value # nil
|
1154
|
+
```
|
1155
|
+
|
1156
|
+
> **Note:** You can also use the `#dig` method with `Kind::Optional` objects.
|
1157
|
+
|
1158
|
+
[⬆️ Back to Top](#table-of-contents-)
|
1159
|
+
|
1093
1160
|
## Kind::Empty
|
1094
1161
|
|
1095
1162
|
When you define a method that has default arguments, for certain data types, you will always create a new object in memory. e.g:
|
data/lib/kind.rb
CHANGED
@@ -2,6 +2,8 @@
|
|
2
2
|
|
3
3
|
require 'kind/version'
|
4
4
|
|
5
|
+
require 'ostruct'
|
6
|
+
|
5
7
|
require 'kind/empty'
|
6
8
|
require 'kind/undefined'
|
7
9
|
require 'kind/checker'
|
@@ -294,7 +296,7 @@ module Kind
|
|
294
296
|
# -- Classes
|
295
297
|
[
|
296
298
|
String, Symbol, Numeric, Integer, Float, Regexp, Time,
|
297
|
-
Array, Range, Hash, Struct, Enumerator, Set,
|
299
|
+
Array, Range, Hash, Struct, Enumerator, Set, OpenStruct,
|
298
300
|
Method, Proc,
|
299
301
|
IO, File
|
300
302
|
].each { |klass| Types.add(klass) }
|
data/lib/kind/dig.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Kind
|
4
|
+
module Dig
|
5
|
+
extend self
|
6
|
+
|
7
|
+
def call(data, keys)
|
8
|
+
return unless keys.is_a?(Array)
|
9
|
+
|
10
|
+
keys.reduce(data) do |memo, key|
|
11
|
+
value = get(memo, key)
|
12
|
+
|
13
|
+
break if value.nil?
|
14
|
+
|
15
|
+
value
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def get(data, key)
|
22
|
+
return data[key] if Hash === data
|
23
|
+
|
24
|
+
case data
|
25
|
+
when Array
|
26
|
+
data[key] if key.respond_to?(:to_int)
|
27
|
+
when OpenStruct
|
28
|
+
data[key] if key.respond_to?(:to_sym)
|
29
|
+
when Struct
|
30
|
+
if key.respond_to?(:to_int) || key.respond_to?(:to_sym)
|
31
|
+
data[key] rescue nil
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/lib/kind/maybe.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'kind/dig'
|
4
|
+
|
3
5
|
module Kind
|
4
6
|
module Maybe
|
5
7
|
class Typed
|
@@ -76,6 +78,10 @@ module Kind
|
|
76
78
|
|
77
79
|
alias_method :try, :try!
|
78
80
|
|
81
|
+
def dig(*keys)
|
82
|
+
NONE_WITH_NIL_VALUE
|
83
|
+
end
|
84
|
+
|
79
85
|
private_constant :INVALID_DEFAULT_ARG
|
80
86
|
end
|
81
87
|
|
@@ -114,6 +120,10 @@ module Kind
|
|
114
120
|
end
|
115
121
|
end
|
116
122
|
|
123
|
+
def dig(*keys)
|
124
|
+
resolve(Kind::Dig.call(value, keys))
|
125
|
+
end
|
126
|
+
|
117
127
|
private
|
118
128
|
|
119
129
|
def __try__(method_name = Undefined, args, block)
|
data/lib/kind/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kind
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.0
|
4
|
+
version: 3.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rodrigo Serradura
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-07-08 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: A simple type system (at runtime) for Ruby - free of dependencies.
|
14
14
|
email:
|
@@ -34,6 +34,7 @@ files:
|
|
34
34
|
- lib/kind/checker.rb
|
35
35
|
- lib/kind/checker/factory.rb
|
36
36
|
- lib/kind/checker/protocol.rb
|
37
|
+
- lib/kind/dig.rb
|
37
38
|
- lib/kind/empty.rb
|
38
39
|
- lib/kind/error.rb
|
39
40
|
- lib/kind/is.rb
|