hash_ish 0.2.0 → 0.3.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/.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
|