hash-path 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/README CHANGED
@@ -30,12 +30,16 @@ Example
30
30
  path :body, "Body"
31
31
  path :code, "Additional/Code"
32
32
  path :time, "Additional/StartDateTime"
33
+
34
+ def time
35
+ Time.parse(super) # parse is defined in active_support, night-time,... gem
36
+ end
33
37
  end
34
38
 
35
39
  item = Item.new(hash)
36
40
  item.name # => "foo"
37
41
  item.code # => 1234
38
- item.time # => "2010/01/10 19:30"
42
+ item.time # => Sun Jan 10 19:30:00 +0900 2010
39
43
 
40
44
 
41
45
  Todo
data/Rakefile CHANGED
@@ -6,7 +6,7 @@ AUTHOR = "maiha"
6
6
  EMAIL = "maiha@wota.jp"
7
7
  HOMEPAGE = "http://github.com/maiha/hash-path"
8
8
  SUMMARY = "path accessor to hierarchical hash"
9
- GEM_VERSION = "0.0.1"
9
+ GEM_VERSION = "0.0.2"
10
10
 
11
11
  spec = Gem::Specification.new do |s|
12
12
  s.rubyforge_project = 'asakusarb'
data/lib/hash-path.rb CHANGED
@@ -1,24 +1,41 @@
1
1
 
2
- class HashPath
2
+ class HashPath < Hash
3
3
  def self.paths
4
4
  @paths ||= {}
5
5
  end
6
6
 
7
7
  def self.path(key, path)
8
- paths[key.to_sym] = path
8
+ paths[key.to_s] = path
9
9
  end
10
10
 
11
- def initialize(hash)
12
- @hash = hash
13
- @cached = {}
11
+ def [](key)
12
+ key = key.to_s
13
+
14
+ # first, check exact value
15
+ return super if has_key?(key)
16
+
17
+ # second, browse children
18
+ return key.split("/").inject(self) {|hash, key| hash[key]}
19
+ rescue Exception => e
20
+ return rescue_hierarchical_access(key, e)
21
+ end
22
+
23
+ def initialize(hash = {})
24
+ super()
25
+ replace(hash)
14
26
  end
15
27
 
16
28
  private
29
+ def rescue_hierarchical_access(key, e)
30
+ return nil
31
+ end
32
+
17
33
  def method_missing(name, *args, &block)
18
- name = name.to_sym
19
- return @cached[name] if @cached.has_key?(name)
20
- return super unless path = self.class.paths[name]
21
- return @cached[name] = path.split("/").inject(@hash) {|hash, key| hash[key]} rescue nil
34
+ if args.empty?
35
+ self[ self.class.paths[name.to_s] || name ]
36
+ else
37
+ super
38
+ end
22
39
  end
23
40
  end
24
41
 
data/spec/api_spec.rb ADDED
@@ -0,0 +1,59 @@
1
+
2
+ require File.join(File.dirname(__FILE__), 'spec_helper.rb')
3
+
4
+ describe HashPath do
5
+ it "should provide .path" do
6
+ HashPath.should respond_to(:path)
7
+ end
8
+
9
+ it "should provide #[]" do
10
+ HashPath.new.should respond_to(:[])
11
+ end
12
+
13
+ def data
14
+ {
15
+ "app" => {
16
+ "models" => "ActiveRecord",
17
+ "controllers" => "ActionController",
18
+ "views" => "ActionView",
19
+ "helpers" => "ActionView::Helpers",
20
+ },
21
+ "vendor" => {
22
+ "plugins" => {
23
+ "aasm" => "Aasm",
24
+ "haml" => "Haml",
25
+ },
26
+ }
27
+ }
28
+ end
29
+
30
+ describe "#[]" do
31
+ subject { HashPath.new(data) }
32
+
33
+ context "(for present)" do
34
+ its("app/models") { should == "ActiveRecord" }
35
+ its("vendor/plugins") { should == {"aasm" => "Aasm", "haml" => "Haml"} }
36
+ end
37
+
38
+ context "(for missing)" do
39
+ its("foo") { should == nil }
40
+ its("foo/bar") { should == nil }
41
+ end
42
+
43
+ context "(for defined path)" do
44
+ class Labeled < HashPath
45
+ path :model , "app/models"
46
+ path :nothing , "no/such/value"
47
+ end
48
+
49
+ subject { Labeled.new(data) }
50
+
51
+ its(:model) { should == "ActiveRecord" }
52
+ its("model") { should == "ActiveRecord" }
53
+ its("app/models") { should == "ActiveRecord" }
54
+ its("vendor/plugins") { should == {"aasm" => "Aasm", "haml" => "Haml"} }
55
+ its(:nothing) { should == nil }
56
+ its("nothing") { should == nil }
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,34 @@
1
+
2
+ require File.join(File.dirname(__FILE__), 'spec_helper.rb')
3
+
4
+ require 'parsedate'
5
+
6
+ describe HashPath do
7
+ def data
8
+ {
9
+ "calendar" => {
10
+ "start" => "2010/01/10 23:30",
11
+ "stop" => "2010/01/10 23:56",
12
+ }
13
+ }
14
+ end
15
+
16
+ class Event < HashPath
17
+ path :st, "calendar/start"
18
+ path :en, "calendar/stop"
19
+
20
+ def st
21
+ to_time(super)
22
+ end
23
+
24
+ private
25
+ def to_time(string)
26
+ array = ParseDate.parsedate(string)
27
+ Time.mktime(*array[0,6])
28
+ end
29
+ end
30
+
31
+ subject { Event.new(data) }
32
+ its(:st) { should == Time.mktime(2010, 1, 10, 23, 30) }
33
+ its(:en) { should == "2010/01/10 23:56" }
34
+ end
@@ -0,0 +1,15 @@
1
+ module Spec
2
+ module Example
3
+ module Subject
4
+ module ExampleGroupMethods
5
+ def its(*args, &block)
6
+ describe(args.first) do
7
+ define_method(:subject) { super().send(*args) }
8
+ it(&block)
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
15
+
@@ -0,0 +1,10 @@
1
+
2
+ require 'spec'
3
+
4
+ require File.join(File.dirname(__FILE__), '/../lib/hash-path')
5
+ require File.join(File.dirname(__FILE__), '/its_helper')
6
+
7
+ def data(key)
8
+ path = File.join(File.dirname(__FILE__) + "/fixtures/#{key}")
9
+ File.read(path){}
10
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hash-path
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - maiha
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-01-10 00:00:00 +09:00
12
+ date: 2010-01-12 00:00:00 +09:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -27,6 +27,10 @@ files:
27
27
  - README
28
28
  - Rakefile
29
29
  - lib/hash-path.rb
30
+ - spec/inherit_spec.rb
31
+ - spec/api_spec.rb
32
+ - spec/its_helper.rb
33
+ - spec/spec_helper.rb
30
34
  has_rdoc: true
31
35
  homepage: http://github.com/maiha/hash-path
32
36
  licenses: []