mash 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (5) hide show
  1. data/History.txt +6 -3
  2. data/README.txt +8 -1
  3. data/lib/mash.rb +28 -4
  4. data/spec/mash_spec.rb +20 -0
  5. metadata +1 -1
@@ -1,6 +1,9 @@
1
- === 1.0.0 / 2008-04-11
1
+ === 0.0.2 / 2008-04-12
2
2
 
3
- * 1 major enhancement
3
+ * Added bang(!) method support
4
+ * No longer automatically multi-level assigning
5
+ * Hash conversion now calls methods instead of []= to allow for overrides
4
6
 
5
- * Birthday!
7
+ === 0.0.1 / 2008-04-12
6
8
 
9
+ * Initial release
data/README.txt CHANGED
@@ -10,13 +10,19 @@ be used in RESTful API libraries to provide easy object-like access
10
10
  to JSON and XML parsed hashes.
11
11
 
12
12
  == SYNOPSIS:
13
-
13
+
14
14
  mash = Mash.new
15
15
  mash.name? # => false
16
+ mash.name # => nil
16
17
  mash.name = "My Mash"
17
18
  mash.name # => "My Mash"
18
19
  mash.name? # => true
19
20
  mash.inspect # => <Mash name="My Mash">
21
+
22
+ mash = Mash.new
23
+ # use bang methods for multi-level assignment
24
+ mash.author!.name = "Michael Bleigh"
25
+ mash.author # => <Mash name="Michael Bleigh">
20
26
 
21
27
  == INSTALL:
22
28
 
@@ -25,6 +31,7 @@ RubyGem:
25
31
  sudo gem install mash
26
32
 
27
33
  Git:
34
+
28
35
  git clone git://github.com/mbleigh/mash
29
36
 
30
37
  == LICENSE:
@@ -4,6 +4,14 @@
4
4
  # without the overhead of actually doing so. Think of it as OpenStruct
5
5
  # with some additional goodies.
6
6
  #
7
+ # A Mash will look at the methods you pass it and perform operations
8
+ # based on the following rules:
9
+ #
10
+ # * No punctuation: Returns the value of the hash for that key, or nil if none exists.
11
+ # * Assignment (<tt>=</tt>): Sets the attribute of the given method name.
12
+ # * Existence (<tt>?</tt>): Returns true or false depending on whether that key has been set.
13
+ # * Bang (<tt>!</tt>): Forces the existence of this key, used for deep Mashes. Think of it as "touch" for mashes.
14
+ #
7
15
  # == Basic Example
8
16
  #
9
17
  # mash = Mash.new
@@ -21,8 +29,18 @@
21
29
  # mash.f.first.g # => 44
22
30
  # mash.f.last # => 12
23
31
  #
32
+ # == Bang Example
33
+ #
34
+ # mash = Mash.new
35
+ # mash.author # => nil
36
+ # mash.author! # => <Mash>
37
+ #
38
+ # mash = Mash.new
39
+ # mash.author!.name = "Michael Bleigh"
40
+ # mash.author # => <Mash name="Michael Bleigh">
41
+ #
24
42
  class Mash < Hash
25
- VERSION = '0.0.1'
43
+ VERSION = '0.0.2'
26
44
 
27
45
  # If you pass in an existing hash, it will
28
46
  # convert it to a Mash including recursively
@@ -66,16 +84,19 @@ class Mash < Hash
66
84
  self[match[1]] = args.first
67
85
  elsif (match = method_name.to_s.match(/(.*)\?$/)) && args.size == 0
68
86
  key?(match[1])
87
+ elsif (match = method_name.to_s.match(/(.*)!$/)) && args.size == 0
88
+ return self[match[1]] if key?(match[1])
89
+ self[match[1]] = Mash.new
69
90
  elsif keys.include?(method_name.to_s)
70
91
  self[method_name]
71
92
  elsif match = method_name.to_s.match(/^([a-z][a-z0-9A-Z_]+)$/)
72
- Mash.new
93
+ nil
73
94
  else
74
95
  super
75
96
  end
76
97
  end
77
98
 
78
- private
99
+ protected
79
100
 
80
101
  def mash_a_hash(hash) #:nodoc:
81
102
  hash.each do |k,v|
@@ -86,7 +107,10 @@ class Mash < Hash
86
107
  v = collect_mashed_hashes_in(v) if v.is_a?(Array)
87
108
  end
88
109
 
89
- self[k] = v
110
+ # we use the method call instead of []= here so that
111
+ # it can be easily overridden for custom behavior in
112
+ # inheriting objects
113
+ self.send "#{k.to_s}=", v
90
114
  end
91
115
  end
92
116
 
@@ -37,6 +37,26 @@ describe Mash do
37
37
  @mash.to_s.should == @mash.inspect
38
38
  end
39
39
 
40
+ it "should return nil instead of raising an error for attribute-esque method calls" do
41
+ @mash.abc.should be_nil
42
+ end
43
+
44
+ it "should return a Mash when passed a bang method to a non-existenct key" do
45
+ @mash.abc!.is_a?(Mash).should be_true
46
+ end
47
+
48
+ it "should return the existing value when passed a bang method for an existing key" do
49
+ @mash.name = "Bob"
50
+ @mash.name!.should == "Bob"
51
+ end
52
+
53
+ it "should allow for multi-level assignment through bang methods" do
54
+ @mash.author!.name = "Michael Bleigh"
55
+ @mash.author.should == Mash.new(:name => "Michael Bleigh")
56
+ @mash.author!.website!.url = "http://www.mbleigh.com/"
57
+ @mash.author.website.should == Mash.new(:url => "http://www.mbleigh.com/")
58
+ end
59
+
40
60
  context "#initialize" do
41
61
  it "should convert an existing hash to a Mash" do
42
62
  converted = Mash.new({:abc => 123, :name => "Bob"})
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mash
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
  - Michael Bleigh