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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b8cdf984ee41b2b0e954c4f60ebc59a31061238a
4
- data.tar.gz: 0ff1cdea6e5b2e7a284902d319163609e882e86e
3
+ metadata.gz: a1a38439e44e7373d05911338c2afad7d500a620
4
+ data.tar.gz: a0c37c7081ea3476a1f1303662e7df1f10f97a06
5
5
  SHA512:
6
- metadata.gz: 1ed2106fde81b31c49bbfe7e4c6315a43ca267a8ef9233ce36334e99e42e731efe6f5b89edc26069b33c26395e5111c333baa8a45235c6adf62e39b541e629e4
7
- data.tar.gz: a0ac9a73f48fd590bd04598d36913720cbbc7115dca46721709b198646d247a523ab3c8b5c2240dbf0c51ba8cee1ea3665882527be02ed63a8e326ed00a4b664
6
+ metadata.gz: 0fb33597f69ca6613984817c57ebd767c2328bd5ed84145af73f941563b4790e19685c789bd11111a16572e7b5648f967f9d265f7d2976e6f7ea707fb2897400
7
+ data.tar.gz: 503bae71593be3bdf69fa272a6316e8df2db40b9dcd8bf4f5666fe15a804d3163048728018b5fb465cd66576a5201159d06f064ee6d3b08b8d148ac426d32bce
data/.gitignore CHANGED
@@ -1,3 +1,4 @@
1
+ .gem
1
2
  /.bundle/
2
3
  /.yardoc
3
4
  /Gemfile.lock
data/.rspec CHANGED
@@ -1,2 +1 @@
1
- --format documentation
2
1
  --color
data/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ ## 0.3.0 (2015-07-22)
2
+
3
+ Features:
4
+ - Can now add default values
5
+ - HashIsh now returns instance of self
6
+
1
7
  ## 0.2.0 (2015-07-22)
2
8
 
3
9
  Features:
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
- ## Usage
15
+ ## Test
16
16
 
17
17
  ```
18
- require 'hash_ish'
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
- # this works
35
- HashIsh.new(foo: "bar").foo # bar
24
+ require 'hash_ish'
36
25
 
37
- # this blows up
38
- HashIsh.new(123 => 456)
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(klass, kwargs)
3
+ def add(hash_ish, kwargs)
4
4
  kwargs.each do |key, value|
5
- define_method(klass, key, value)
5
+ define_method(hash_ish, key, value)
6
6
  end
7
7
  end
8
8
 
9
- def define_method(klass, name, value)
9
+ def define_method(hash_ish, name, value)
10
10
  return_value = method_value(value)
11
11
 
12
- klass.send(:define_method, name) do
12
+ hash_ish.send(:define_singleton_method, name) do
13
13
  return_value
14
14
  end
15
15
  end
16
16
 
17
- def hash?(object)
17
+ def is_a_hash?(object)
18
18
  object.is_a? Hash
19
19
  end
20
20
 
21
- def hash_ish(value)
22
- HashIsh.new(value)
21
+ def hash_ish(hash)
22
+ HashIsh.new(hash)
23
23
  end
24
24
 
25
25
  def method_value(value)
26
- hash?(value) ? hash_ish(value) : value
26
+ is_a_hash?(value) ? hash_ish(value) : value
27
27
  end
28
28
  end
29
29
  end
@@ -1,3 +1,3 @@
1
- class HashIsh
2
- VERSION = "0.2.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 self.new(kwargs = {})
6
- instance(
7
- decorate_klass(hash_sub_class, kwargs))
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 self.decorate_klass(klass, kwargs)
11
- klass.tap do |klass|
12
- AddInstanceMethods.new.add(klass, kwargs)
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.2.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-12 00:00:00.000000000 Z
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