fat-rb 1.0.0 → 2.0.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/README.md +1 -83
- data/fat-rb.gemspec +1 -1
- data/lib/fat.rb +14 -28
- data/test/fat_test.rb +31 -54
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 12f093f4b8df095cdd3b0b4eb0ba1a2acdcc81b5
|
4
|
+
data.tar.gz: ccfd4bd0e8c7903d67142d00ffa2446adc12542d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cc9f4281017434079d02f9c42a332e0f83fef95f7e6f01e5fd13cba110d18dd2296e871d482ff32ad5e361be6947ae2405f936f8c3b93d16c49d9692e9747a7e
|
7
|
+
data.tar.gz: 20de6a4911dff4a50f9c727b4869057bffe77672ba7695c2b0b645d17c86f1befe8016ebd2c1ce7889dbb050ab1e234b62105e2c8cbf97de15d3d71c1a61f41f
|
data/README.md
CHANGED
@@ -3,89 +3,7 @@ fat
|
|
3
3
|
|
4
4
|
Ruby implementation for [Fat](https://github.com/tonchis/fat), to support non-MRI.
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
# Use
|
9
|
-
|
10
|
-
Say you have the following hash
|
11
|
-
|
12
|
-
```ruby
|
13
|
-
hash = {
|
14
|
-
"foo" => {
|
15
|
-
"bar" => {
|
16
|
-
"baz" => :value
|
17
|
-
}
|
18
|
-
}
|
19
|
-
}
|
20
|
-
```
|
21
|
-
|
22
|
-
To get your `:value` you usually do `hash["foo"]["bar"]["baz"]`. But what happens if `"bar"` doesn't exist? Yeap, BOOM!
|
23
|
-
|
24
|
-
I find more comfortable to ask if I can walk to `:value` using the keys `"foo"`, `"bar"`, `"baz"`. If I can't, tell me where the path ends.
|
25
|
-
|
26
|
-
```ruby
|
27
|
-
require "fat-rb"
|
28
|
-
|
29
|
-
Fat.at(hash, "foo", "bar", "baz")
|
30
|
-
# => :value
|
31
|
-
|
32
|
-
Fat.at(hash, "foo", "not", "here")
|
33
|
-
# => Fat::FatError: No hash found at foo.not
|
34
|
-
```
|
35
|
-
|
36
|
-
The `Fat::FatError` let's you know that a `Hash` was expected as a value for the key `"not"`. Way more explicit than guessing from a `undefined method [] for nil`.
|
37
|
-
|
38
|
-
It's the same with Symbols
|
39
|
-
|
40
|
-
```ruby
|
41
|
-
hash = {
|
42
|
-
"foo" => {
|
43
|
-
:bar => {
|
44
|
-
"baz" => :value
|
45
|
-
}
|
46
|
-
}
|
47
|
-
}
|
48
|
-
|
49
|
-
Fat.at(hash, "foo", :bar, "baz")
|
50
|
-
# => :value
|
51
|
-
```
|
52
|
-
|
53
|
-
If you prefer to call `hash.at` you only need to include `Fat` into `Hash`.
|
54
|
-
|
55
|
-
```ruby
|
56
|
-
Hash.include(Fat)
|
57
|
-
|
58
|
-
hash.at("foo", "bar", "baz")
|
59
|
-
# => :value
|
60
|
-
```
|
61
|
-
|
62
|
-
You can also *namespace* the keys with dots `.` or colons `:` if they are all Strings or Symbols, respectively.
|
63
|
-
|
64
|
-
```ruby
|
65
|
-
Hash.include(Fat)
|
66
|
-
|
67
|
-
hash = {
|
68
|
-
"foo" => {
|
69
|
-
"bar" => {
|
70
|
-
"baz" => :value
|
71
|
-
}
|
72
|
-
}
|
73
|
-
}
|
74
|
-
|
75
|
-
hash.at("foo.bar.baz")
|
76
|
-
# => :value
|
77
|
-
|
78
|
-
hash = {
|
79
|
-
foo: {
|
80
|
-
bar: {
|
81
|
-
baz: :value
|
82
|
-
}
|
83
|
-
}
|
84
|
-
}
|
85
|
-
|
86
|
-
hash.at("foo:bar:baz")
|
87
|
-
# => :value
|
88
|
-
```
|
6
|
+
Please look at the [README](https://github.com/tonchis/fat/blob/master/README.md) in that repository to learn about `Fat`.
|
89
7
|
|
90
8
|
# Install
|
91
9
|
|
data/fat-rb.gemspec
CHANGED
data/lib/fat.rb
CHANGED
@@ -1,39 +1,25 @@
|
|
1
1
|
module Fat
|
2
2
|
FatError = Class.new(StandardError)
|
3
3
|
|
4
|
-
def self.at(hash, *args)
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
if
|
10
|
-
|
4
|
+
def self.at(hash, *args, **keywords)
|
5
|
+
value = hash
|
6
|
+
|
7
|
+
args.each_with_index do |field, index|
|
8
|
+
value = value[field]
|
9
|
+
if value.nil?
|
10
|
+
if !keywords.empty?
|
11
|
+
return keywords[:default]
|
12
|
+
else
|
13
|
+
raise Fat::FatError, "#{args[0..index].join(".")} is nil"
|
14
|
+
end
|
11
15
|
end
|
12
16
|
end
|
13
17
|
|
14
|
-
|
15
|
-
end
|
16
|
-
|
17
|
-
def self.parse_args(*args)
|
18
|
-
return args if args.length > 1
|
19
|
-
|
20
|
-
fields = args.first.split(".")
|
21
|
-
|
22
|
-
if fields.length == 1
|
23
|
-
fields = args.first.split(":")
|
24
|
-
|
25
|
-
if fields.length == 1
|
26
|
-
raise FatError, "Single argument expected to be a namespace with dots (.) or colons (:)"
|
27
|
-
else
|
28
|
-
fields.map(&:to_sym)
|
29
|
-
end
|
30
|
-
else
|
31
|
-
fields
|
32
|
-
end
|
18
|
+
value
|
33
19
|
end
|
34
20
|
|
35
|
-
def at(*args)
|
36
|
-
Fat.at(self, *args)
|
21
|
+
def at(*args, **keywords)
|
22
|
+
Fat.at(self, *args, keywords)
|
37
23
|
end
|
38
24
|
end
|
39
25
|
|
data/test/fat_test.rb
CHANGED
@@ -4,87 +4,60 @@ require_relative "../lib/fat"
|
|
4
4
|
scope do
|
5
5
|
setup do
|
6
6
|
{
|
7
|
-
foo
|
7
|
+
"foo" => {
|
8
8
|
"bar" => {
|
9
|
-
baz
|
9
|
+
"baz" => :found
|
10
10
|
}
|
11
11
|
}
|
12
12
|
}
|
13
13
|
end
|
14
14
|
|
15
|
-
test "
|
16
|
-
|
17
|
-
assert_equal "No hash found at foo.bar", exception.message
|
18
|
-
|
19
|
-
assert_equal :found, Fat.at(hash, :foo, "bar", :baz)
|
15
|
+
test "find value" do |hash|
|
16
|
+
assert_equal :found, Fat.at(hash, "foo", "bar", "baz")
|
20
17
|
end
|
21
|
-
end
|
22
18
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
assert_equal "Single argument expected to be a namespace with dots (.) or colons (:)", exception.message
|
27
|
-
end
|
28
|
-
end
|
19
|
+
test "don't find value" do |hash|
|
20
|
+
exception = assert_raise(Fat::FatError) { Fat.at(hash, "foo", "bar", "wat") }
|
21
|
+
assert_equal "foo.bar.wat is nil", exception.message
|
29
22
|
|
30
|
-
|
31
|
-
|
32
|
-
{
|
33
|
-
"foo" => {
|
34
|
-
"bar" => {
|
35
|
-
"baz" => :found
|
36
|
-
}
|
37
|
-
}
|
38
|
-
}
|
23
|
+
exception = assert_raise(Fat::FatError) { Fat.at(hash, "foo", "wat", "baz") }
|
24
|
+
assert_equal "foo.wat is nil", exception.message
|
39
25
|
end
|
40
26
|
|
41
|
-
test "
|
42
|
-
assert_equal
|
43
|
-
|
44
|
-
exception = assert_raise(Fat::FatError) { Fat.at(hash, "foo.not.baz") }
|
45
|
-
assert_equal "No hash found at foo.not", exception.message
|
27
|
+
test "return default value" do |hash|
|
28
|
+
assert_equal "default", Fat.at(hash, "foo", "wat", "baz", default: "default")
|
29
|
+
assert_equal nil, Fat.at(hash, "foo", "bar", "wat", default: nil)
|
46
30
|
end
|
47
|
-
end
|
48
31
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
baz: :found
|
55
|
-
}
|
56
|
-
}
|
57
|
-
}
|
58
|
-
end
|
32
|
+
test "include the module" do |hash|
|
33
|
+
Hash.include(Fat)
|
34
|
+
|
35
|
+
assert hash.respond_to?(:at)
|
36
|
+
assert_equal :found, hash.at("foo", "bar", "baz")
|
59
37
|
|
60
|
-
|
61
|
-
assert_equal
|
38
|
+
exception = assert_raise(Fat::FatError) { hash.at("foo", "wat", "baz") }
|
39
|
+
assert_equal "foo.wat is nil", exception.message
|
62
40
|
|
63
|
-
|
64
|
-
assert_equal "No hash found at foo.not", exception.message
|
41
|
+
assert_equal nil, hash.at("foo", "bar", "wat", default: nil)
|
65
42
|
end
|
66
43
|
end
|
67
44
|
|
68
45
|
scope do
|
69
46
|
setup do
|
70
|
-
Hash.include(Fat)
|
71
|
-
|
72
47
|
{
|
73
|
-
|
48
|
+
foo: {
|
74
49
|
"bar" => {
|
75
|
-
|
50
|
+
baz: :found
|
76
51
|
}
|
77
52
|
}
|
78
53
|
}
|
79
54
|
end
|
80
55
|
|
81
|
-
test "
|
82
|
-
|
83
|
-
|
56
|
+
test "honor key type" do |hash|
|
57
|
+
exception = assert_raise(Fat::FatError) { Fat.at(hash, :foo, :bar, :found) }
|
58
|
+
assert_equal "foo.bar is nil", exception.message
|
84
59
|
|
85
|
-
|
86
|
-
assert_equal :found, hash.at("foo", "bar", "baz")
|
87
|
-
assert_equal :found, hash.at("foo.bar.baz")
|
60
|
+
assert_equal :found, Fat.at(hash, :foo, "bar", :baz)
|
88
61
|
end
|
89
62
|
end
|
90
63
|
|
@@ -93,9 +66,13 @@ scope do
|
|
93
66
|
Hash.include(Fat)
|
94
67
|
end
|
95
68
|
|
96
|
-
test "corner case" do
|
69
|
+
test "corner case: empty hashes" do
|
97
70
|
assert_raise(Fat::FatError) { {}.at(:foo, :bar) }
|
98
71
|
assert_raise(Fat::FatError) { Fat.at({}, :foo, :bar) }
|
99
72
|
end
|
73
|
+
|
74
|
+
test "corner case: lookup a single key" do
|
75
|
+
assert_equal :found, {"foo" => :found}.at("foo")
|
76
|
+
end
|
100
77
|
end
|
101
78
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fat-rb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lucas Tolchinsky
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-12-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: cutest
|