hash_ish 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.rspec +0 -1
- data/CHANGELOG.md +6 -0
- data/README.md +20 -17
- data/lib/hash_ish/add_default_values.rb +37 -0
- data/lib/hash_ish/add_instance_methods.rb +8 -8
- data/lib/hash_ish/version.rb +2 -2
- data/lib/hash_ish.rb +8 -15
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a1a38439e44e7373d05911338c2afad7d500a620
|
4
|
+
data.tar.gz: a0c37c7081ea3476a1f1303662e7df1f10f97a06
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0fb33597f69ca6613984817c57ebd767c2328bd5ed84145af73f941563b4790e19685c789bd11111a16572e7b5648f967f9d265f7d2976e6f7ea707fb2897400
|
7
|
+
data.tar.gz: 503bae71593be3bdf69fa272a6316e8df2db40b9dcd8bf4f5666fe15a804d3163048728018b5fb465cd66576a5201159d06f064ee6d3b08b8d148ac426d32bce
|
data/.gitignore
CHANGED
data/.rspec
CHANGED
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -12,30 +12,33 @@ Add it to your Gemfile or...
|
|
12
12
|
gem install hash_ish
|
13
13
|
```
|
14
14
|
|
15
|
-
##
|
15
|
+
## Test
|
16
16
|
|
17
17
|
```
|
18
|
-
|
19
|
-
|
20
|
-
# insert hash into new hash_ish
|
21
|
-
hash = { a { b: "c" } }
|
22
|
-
hash_ish = HashIsh.new(hash)
|
23
|
-
|
24
|
-
# access hash keys with method calls
|
25
|
-
hash_ish.a.b # returns 'c'
|
18
|
+
bundle exec rspec
|
26
19
|
```
|
27
20
|
|
28
|
-
|
29
|
-
## Known issues
|
30
|
-
|
31
|
-
- currently only supports hash keys that would be valid method names
|
21
|
+
## Usage
|
32
22
|
|
33
23
|
```
|
34
|
-
|
35
|
-
HashIsh.new(foo: "bar").foo # bar
|
24
|
+
require 'hash_ish'
|
36
25
|
|
37
|
-
#
|
38
|
-
|
26
|
+
# access hash keys with method calls
|
27
|
+
hash = { a { b: 'c' } }
|
28
|
+
hash_ish = HashIsh.new(hash)
|
29
|
+
hash_ish.a.b # returns 'c', via method chaining
|
30
|
+
hash_ish[:a][:b] # returns 'c', via hash square brackets
|
31
|
+
hash_ish.fetch(:a) # returns { b: 'c'}, via fetch
|
32
|
+
hash_ish[:d] # returns nil, just a like a Hash
|
33
|
+
hash_ish.d # raises NoMethodError, doesn't return nil
|
34
|
+
|
35
|
+
# set default values
|
36
|
+
hash = { a: nil, b: { c: false }, d: { e: 'lol' } }
|
37
|
+
defaults = { a: 123, b: { c: true }, d: { e: 'ಠ_ಠ' } }
|
38
|
+
hash_ish = HashIsh.new(hash, defaults)
|
39
|
+
hash_ish.a # returns 123, overrides falsey nil
|
40
|
+
hash_ish.b.c # returns true, overrides falsey false
|
41
|
+
hash_ish.d.e # returns 'lol', not overriden due to 'lol' being truthy
|
39
42
|
```
|
40
43
|
|
41
44
|
## License
|
@@ -0,0 +1,37 @@
|
|
1
|
+
class HashIsh
|
2
|
+
class AddDefaultValues
|
3
|
+
def add(kwargs, defaults)
|
4
|
+
hash = kwargs.dup
|
5
|
+
|
6
|
+
hash.tap do |hash|
|
7
|
+
add_defaults(hash, defaults)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def add_defaults(hash, defaults)
|
12
|
+
defaults.each do |key, value|
|
13
|
+
if is_a_hash?(value)
|
14
|
+
arg_hash = hash[key] || {}
|
15
|
+
hash[key] = AddDefaultValues.new.add(arg_hash, value)
|
16
|
+
else
|
17
|
+
hash[key] ||= value
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def truthy?(hash, key)
|
23
|
+
!!hash[key]
|
24
|
+
end
|
25
|
+
|
26
|
+
def is_a_hash?(object)
|
27
|
+
object.is_a? Hash
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
# puts AddDefaultValues.new.add({}, { a: 1 }).inspect
|
33
|
+
# puts AddDefaultValues.new.add({a: 2}, { a: 1 }).inspect
|
34
|
+
# puts AddDefaultValues.new.add({a: 2}, { a: 1, b: 1 }).inspect
|
35
|
+
# puts AddDefaultValues.new.add({ a: { b: nil }}, { a: { b: 1 } }).inspect
|
36
|
+
# puts AddDefaultValues.new.add({ a: { b: 2 }}, { a: { b: 1 } }).inspect
|
37
|
+
# puts AddDefaultValues.new.add({ a: { b: false }, c: { d: true }}, { a: { b: 1 }, c: { d: 123} }).inspect
|
@@ -1,29 +1,29 @@
|
|
1
1
|
class HashIsh
|
2
2
|
class AddInstanceMethods
|
3
|
-
def add(
|
3
|
+
def add(hash_ish, kwargs)
|
4
4
|
kwargs.each do |key, value|
|
5
|
-
define_method(
|
5
|
+
define_method(hash_ish, key, value)
|
6
6
|
end
|
7
7
|
end
|
8
8
|
|
9
|
-
def define_method(
|
9
|
+
def define_method(hash_ish, name, value)
|
10
10
|
return_value = method_value(value)
|
11
11
|
|
12
|
-
|
12
|
+
hash_ish.send(:define_singleton_method, name) do
|
13
13
|
return_value
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
17
|
-
def
|
17
|
+
def is_a_hash?(object)
|
18
18
|
object.is_a? Hash
|
19
19
|
end
|
20
20
|
|
21
|
-
def hash_ish(
|
22
|
-
HashIsh.new(
|
21
|
+
def hash_ish(hash)
|
22
|
+
HashIsh.new(hash)
|
23
23
|
end
|
24
24
|
|
25
25
|
def method_value(value)
|
26
|
-
|
26
|
+
is_a_hash?(value) ? hash_ish(value) : value
|
27
27
|
end
|
28
28
|
end
|
29
29
|
end
|
data/lib/hash_ish/version.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
|
-
class HashIsh
|
2
|
-
VERSION = "0.
|
1
|
+
class HashIsh < Hash
|
2
|
+
VERSION = "0.3.0"
|
3
3
|
end
|
data/lib/hash_ish.rb
CHANGED
@@ -1,23 +1,16 @@
|
|
1
1
|
require 'hash_ish/version'
|
2
|
+
require 'hash_ish/add_default_values'
|
2
3
|
require 'hash_ish/add_instance_methods'
|
3
4
|
|
4
|
-
class HashIsh
|
5
|
-
def
|
6
|
-
|
7
|
-
|
5
|
+
class HashIsh < Hash
|
6
|
+
def initialize(kwargs = {}, defaults = {})
|
7
|
+
default_kwargs = AddDefaultValues.new.add(kwargs, defaults)
|
8
|
+
decorate_self(self, default_kwargs)
|
8
9
|
end
|
9
10
|
|
10
|
-
def
|
11
|
-
|
12
|
-
AddInstanceMethods.new.add(
|
11
|
+
def decorate_self(hash_ish, kwargs)
|
12
|
+
hash_ish.tap do |hash_ish|
|
13
|
+
AddInstanceMethods.new.add(hash_ish, kwargs)
|
13
14
|
end
|
14
15
|
end
|
15
|
-
|
16
|
-
def self.instance(klass)
|
17
|
-
klass.new
|
18
|
-
end
|
19
|
-
|
20
|
-
def self.hash_sub_class
|
21
|
-
Class.new(Hash)
|
22
|
-
end
|
23
16
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hash_ish
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Pope
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-11-
|
11
|
+
date: 2015-11-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -72,6 +72,7 @@ files:
|
|
72
72
|
- bin/setup
|
73
73
|
- hash_ish.gemspec
|
74
74
|
- lib/hash_ish.rb
|
75
|
+
- lib/hash_ish/add_default_values.rb
|
75
76
|
- lib/hash_ish/add_instance_methods.rb
|
76
77
|
- lib/hash_ish/version.rb
|
77
78
|
homepage: https://github.com/amorphid/hash_ish
|