hipsterhash 0.0.1 → 0.0.2

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.
data/hipsterhash.gemspec CHANGED
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
 
5
5
  Gem::Specification.new do |gem|
6
6
  gem.name = "hipsterhash"
7
- gem.version = "0.0.1"
7
+ gem.version = "0.0.2"
8
8
  gem.authors = ["Bryan JJ Buckley"]
9
9
  gem.email = ["jjbuckley@gmail.com"]
10
10
  gem.description = %q{A hash which is all, like, whatever.}
data/lib/hipster_hash.rb CHANGED
@@ -1,17 +1,54 @@
1
1
  # -*- encoding : utf-8 -*-
2
- require 'active_support/hash_with_indifferent_access'
3
2
  require 'active_support/core_ext/string/inflections'
4
3
 
5
4
  # A HipsterHash is like a regular Hash, except the keys are semi case
6
5
  # insensitive, and symbols and strings are equivalent. Therefore, :foo_bar,
7
6
  # :FooBar, and "foo_bar" are considered to be the same key.
8
- class HipsterHash < HashWithIndifferentAccess
9
- def [](key, *extras)
10
- super(convert_key(key), *extras)
7
+ class HipsterHash < Hash
8
+ def initialize(initial = {}, &block)
9
+ case initial
10
+ when Hash
11
+ super(&block)
12
+ initial.each { |k, v| self[k] = v }
13
+ else
14
+ super
15
+ end
16
+ end
17
+
18
+ def [](key)
19
+ convert_value(super(convert_key(key)))
20
+ end
21
+
22
+ def []=(key, value)
23
+ super(convert_key(key), value)
24
+ end
25
+
26
+ def method_missing(sym, *args, &block)
27
+ if args.empty? and !block_given?
28
+ self[sym] || super
29
+ else
30
+ super
31
+ end
11
32
  end
12
33
 
13
34
  protected
14
35
  def convert_key(k)
36
+ self.class.convert_key(k)
37
+ end
38
+
39
+ def self.convert_key(k)
15
40
  k.to_s.underscore.to_sym
16
41
  end
42
+
43
+ def self.convert_value(arg)
44
+ case arg
45
+ when Hash then new(arg)
46
+ when Array then arg.map { |a| convert_value(a) }
47
+ else arg
48
+ end
49
+ end
50
+
51
+ def convert_value(arg)
52
+ self.class.convert_value(arg)
53
+ end
17
54
  end
@@ -12,12 +12,18 @@ class HipsterHashTest < Test::Unit::TestCase
12
12
  end
13
13
 
14
14
  def test_indifference_to_input_type
15
- hh = HipsterHash.new({ :foo => "bar" })
15
+ hh = HipsterHash.new(:foo => "bar")
16
16
  assert_equal "bar", hh["foo"]
17
17
  hh['foo'] = "baz"
18
18
  assert_equal "baz", hh[:foo]
19
19
  end
20
20
 
21
+ def test_nesting
22
+ hh = HipsterHash.new(:foo => { :bar => :baz })
23
+ assert_kind_of HipsterHash, hh[:foo]
24
+ assert_equal :baz, hh["Foo"][:Bar]
25
+ end
26
+
21
27
  def test_case_indifference
22
28
  hh = HipsterHash.new
23
29
  hh[:foo_bar] = "bar"
@@ -25,4 +31,21 @@ class HipsterHashTest < Test::Unit::TestCase
25
31
  hh['FooBar'] = "baz"
26
32
  assert_equal "baz", hh[:foo_bar]
27
33
  end
34
+
35
+ def test_creation_with_a_hash
36
+ hh = HipsterHash.new(:foo_bar => "Bar")
37
+ assert_equal "Bar", hh["FooBar"]
38
+ end
39
+
40
+ def test_subclassing
41
+ hc = Class.new(HipsterHash)
42
+ hh = hc.new(:foo_bar => "Baz")
43
+ assert_equal "Baz", hh["FooBar"]
44
+ end
45
+
46
+ def test_method_missing
47
+ hh = HipsterHash.new(:Foo => :bar)
48
+ assert_equal :bar, hh.foo
49
+ assert_equal :bar, hh.FOO
50
+ end
28
51
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hipsterhash
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-10-14 00:00:00.000000000 Z
12
+ date: 2012-10-22 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport