shash 0.0.6 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (5) hide show
  1. data/.gitignore +1 -0
  2. data/lib/shash.rb +31 -26
  3. data/lib/version.rb +1 -1
  4. data/test/test_shash.rb +14 -28
  5. metadata +20 -41
@@ -0,0 +1 @@
1
+ .idea
@@ -1,27 +1,18 @@
1
- class Shash
2
- def initialize(hash={}, &proc)
3
- @_hash = hash
4
- @_proc = proc
1
+ class Shash
2
+ def initialize(hash={})
3
+ @hash = {}
4
+ init!(hash)
5
5
  end
6
-
7
- def _key key
8
- @_proc ? @_proc.call(key) : key.to_s
9
- end
10
6
 
11
7
  def method_missing(key, *args, &block)
12
8
  if key[/=$/]
13
- @_hash[_key(key[0...-1])] = args.first
9
+ self[key[0...-1]] = args.first
14
10
  else
15
- if value = @_hash[_key(key)]
16
- case value
17
- when Hash
18
- Shash.new(value, &@_proc)
19
- else
20
- value
21
- end
11
+ if @hash.key?(key)
12
+ @hash[key]
22
13
  else
23
14
  begin
24
- @_hash.send(key, *args, &block)
15
+ @hash.send(key, *args, &block)
25
16
  rescue NoMethodError
26
17
  nil
27
18
  end
@@ -29,22 +20,36 @@ class Shash
29
20
  end
30
21
  end
31
22
 
32
- def has_key?(key)
33
- @_hash.has_key?(key)
34
- end
35
- alias_method :key?, :has_key?
36
-
37
23
  def ==(other)
38
- other == @_hash
24
+ other == @hash
39
25
  end
40
26
 
41
27
  def []=(key,value)
42
- @_hash[key] = value
28
+ @hash[key.respond_to?(:to_sym) ? key.to_sym : key] = shashify(value)
29
+ end
30
+
31
+ protected
32
+
33
+ def init!(hash)
34
+ hash.each do |k,v|
35
+ self[k] = v
36
+ end
37
+ end
38
+
39
+ def shashify(value)
40
+ case value
41
+ when Hash
42
+ Shash.new(value)
43
+ when Array
44
+ value.map{|v| self.shashify(v)}
45
+ else
46
+ value
47
+ end
43
48
  end
44
49
  end
45
50
 
46
51
  class Hash
47
- def to_shash &proc
48
- Shash.new(self, &proc)
52
+ def to_shash
53
+ Shash.new(self)
49
54
  end
50
55
  end
@@ -1,7 +1,7 @@
1
1
  class Shash
2
2
  MAJOR = 0
3
3
  MINOR = 0
4
- BUILD = 6
4
+ BUILD = 7
5
5
 
6
6
  VERSION = "#{MAJOR}.#{MINOR}.#{BUILD}"
7
7
  end
@@ -26,45 +26,31 @@ describe Shash do
26
26
 
27
27
  it "#has_key? should check for key existence correctly" do
28
28
  h = {"a"=>1, "b"=>{"c"=>2}}.to_shash
29
- h.has_key?("z").should == false
30
- h.has_key?("b").should == true
31
- h.b.has_key?("c").should == true
29
+ h.has_key?(:z).should == false
30
+ h.has_key?(:b).should == true
31
+ h.b.has_key?(:c).should == true
32
32
  end
33
33
 
34
34
  it "#[] should still works as expected" do
35
35
  h = {"a"=>1}.to_shash
36
36
  h.a.should == 1
37
- h["a"].should == 1
37
+ h[:a].should == 1
38
38
  end
39
39
 
40
40
  it "#[]= should still works as expected" do
41
41
  h = Shash.new
42
- h["b"] = 2
43
- h.b.should == 2
44
- end
45
-
46
- it "#initialize should take a block and call it for each key before set/get" do
47
- h = Shash.new(:a=>1){ |k| k.to_sym }
48
- h.b = 2
49
- h.should == {:a=>1, :b=>2}.to_shash
50
- h.has_key?(:b).should == true
42
+ h[:b] = 2
51
43
  h.b.should == 2
52
44
  end
53
-
54
- it "#initialize should propagates the proc to sub-shashes when given" do
55
- h = Shash.new{ |k| k.to_sym }
56
- h.a = {}
57
- h.a.b = 1
58
- h.should == {:a=>{:b=>1}}
59
- end
60
-
61
- it "should handles all sort of fancy things" do
62
- h = Shash.new{ |k| k.upcase.reverse }
63
- h.test = "are you sure?"
64
- h.has_key?("test").should == false
65
- h.has_key?("TSET").should == true
66
- h.test.should == "are you sure?"
67
- h.should == {"TSET"=>"are you sure?"}.to_shash
45
+
46
+ it "#should handle hashes containing arrays properly" do
47
+ h = {:a => 1, :b => [{:ba => 1, :bb => 2}, [{:ccc => 3}]]}.to_shash
48
+ h.a.should == 1
49
+ h.b.should == [{:ba => 1, :bb => 2}.to_shash, [{:ccc => 3}.to_shash]]
50
+ h.b[0].should == {:ba => 1, :bb => 2}.to_shash
51
+ h.b[1][0].should == {:ccc => 3}.to_shash
52
+ h.b[1][0].ccc.should == 3
53
+ h.b.last.first.ccc.should == 3
68
54
  end
69
55
 
70
56
  end
metadata CHANGED
@@ -1,74 +1,53 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: shash
3
- version: !ruby/object:Gem::Version
4
- hash: 19
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.7
5
5
  prerelease:
6
- segments:
7
- - 0
8
- - 0
9
- - 6
10
- version: 0.0.6
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Christian Blais
14
9
  autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
-
18
- date: 2011-11-07 00:00:00 -05:00
19
- default_executable:
12
+ date: 2012-01-25 00:00:00.000000000 Z
20
13
  dependencies: []
21
-
22
14
  description: Replace hash keys with method calls
23
- email:
15
+ email:
24
16
  - christ.blais@gmail.com
25
17
  executables: []
26
-
27
18
  extensions: []
28
-
29
19
  extra_rdoc_files: []
30
-
31
- files:
20
+ files:
21
+ - .gitignore
32
22
  - LICENSE
33
23
  - README.md
34
24
  - lib/shash.rb
35
25
  - lib/version.rb
36
26
  - shash.gemspec
37
27
  - test/test_shash.rb
38
- has_rdoc: true
39
28
  homepage: http://github.com/christianblais/shash
40
29
  licenses: []
41
-
42
30
  post_install_message:
43
31
  rdoc_options: []
44
-
45
- require_paths:
32
+ require_paths:
46
33
  - lib
47
34
  - test
48
- required_ruby_version: !ruby/object:Gem::Requirement
35
+ required_ruby_version: !ruby/object:Gem::Requirement
49
36
  none: false
50
- requirements:
51
- - - ">="
52
- - !ruby/object:Gem::Version
53
- hash: 3
54
- segments:
55
- - 0
56
- version: "0"
57
- required_rubygems_version: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ! '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ required_rubygems_version: !ruby/object:Gem::Requirement
58
42
  none: false
59
- requirements:
60
- - - ">="
61
- - !ruby/object:Gem::Version
62
- hash: 3
63
- segments:
64
- - 0
65
- version: "0"
43
+ requirements:
44
+ - - ! '>='
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
66
47
  requirements: []
67
-
68
48
  rubyforge_project:
69
- rubygems_version: 1.6.2
49
+ rubygems_version: 1.8.10
70
50
  signing_key:
71
51
  specification_version: 3
72
52
  summary: Replace hash keys with method calls
73
53
  test_files: []
74
-