mash 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,6 @@
1
+ === 1.0.0 / 2008-04-11
2
+
3
+ * 1 major enhancement
4
+
5
+ * Birthday!
6
+
@@ -0,0 +1,7 @@
1
+ History.txt
2
+ Manifest.txt
3
+ README.txt
4
+ Rakefile
5
+ lib/mash.rb
6
+ spec/mash_spec.rb
7
+ spec/spec_helper.rb
@@ -0,0 +1,51 @@
1
+ = Mash (Mocking Hash)
2
+
3
+ http://github.com/mbleigh/mash
4
+
5
+ == DESCRIPTION:
6
+
7
+ Mash is an extended Hash that gives simple pseudo-object functionality
8
+ that can be built from hashes and easily extended. It is designed to
9
+ be used in RESTful API libraries to provide easy object-like access
10
+ to JSON and XML parsed hashes.
11
+
12
+ == SYNOPSIS:
13
+
14
+ mash = Mash.new
15
+ mash.name? # => false
16
+ mash.name = "My Mash"
17
+ mash.name # => "My Mash"
18
+ mash.name? # => true
19
+ mash.inspect # => <Mash name="My Mash">
20
+
21
+ == INSTALL:
22
+
23
+ RubyGem:
24
+
25
+ sudo gem install mash
26
+
27
+ Git:
28
+ git clone git://github.com/mbleigh/mash
29
+
30
+ == LICENSE:
31
+
32
+ Copyright (c) 2008 Michael Bleigh
33
+
34
+ Permission is hereby granted, free of charge, to any person obtaining
35
+ a copy of this software and associated documentation files (the
36
+ 'Software'), to deal in the Software without restriction, including
37
+ without limitation the rights to use, copy, modify, merge, publish,
38
+ distribute, sublicense, and/or sell copies of the Software, and to
39
+ permit persons to whom the Software is furnished to do so, subject to
40
+ the following conditions:
41
+
42
+ The above copyright notice and this permission notice shall be
43
+ included in all copies or substantial portions of the Software.
44
+
45
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
46
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
47
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
48
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
49
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
50
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
51
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,18 @@
1
+ # -*- ruby -*-
2
+
3
+ require 'rubygems'
4
+ require 'hoe'
5
+ require './lib/mash.rb'
6
+ require 'spec/rake/spectask'
7
+
8
+ Hoe.new('mash', Mash::VERSION) do |p|
9
+ p.rubyforge_name = 'mash-hash' # if different than lowercase project name
10
+ p.developer('Michael Bleigh', 'michael@intridea.com')
11
+ p.remote_rdoc_dir = ''
12
+ end
13
+
14
+ desc "Run specs."
15
+ Spec::Rake::SpecTask.new("spec") do |t|
16
+ t.spec_files = "spec/*_spec.rb"
17
+ end
18
+ # vim: syntax=Ruby
@@ -0,0 +1,105 @@
1
+ # Mash allows you to create pseudo-objects that have method-like
2
+ # accessors for hash keys. This is useful for such implementations
3
+ # as an API-accessing library that wants to fake robust objects
4
+ # without the overhead of actually doing so. Think of it as OpenStruct
5
+ # with some additional goodies.
6
+ #
7
+ # == Basic Example
8
+ #
9
+ # mash = Mash.new
10
+ # mash.name? # => false
11
+ # mash.name = "Bob"
12
+ # mash.name # => "Bob"
13
+ # mash.name? # => true
14
+ #
15
+ # == Hash Conversion Example
16
+ #
17
+ # hash = {:a => {:b => 23, :d => {:e => "abc"}}, :f => [{:g => 44, :h => 29}, 12]}
18
+ # mash = Mash.new(hash)
19
+ # mash.a.b # => 23
20
+ # mash.a.d.e # => "abc"
21
+ # mash.f.first.g # => 44
22
+ # mash.f.last # => 12
23
+ #
24
+ class Mash < Hash
25
+ VERSION = '0.0.1'
26
+
27
+ # If you pass in an existing hash, it will
28
+ # convert it to a Mash including recursively
29
+ # descending into arrays and hashes, converting
30
+ # them as well.
31
+ def initialize(source_hash = nil)
32
+ mash_a_hash(source_hash) if source_hash
33
+ super(nil)
34
+ end
35
+
36
+ def id #:nodoc:
37
+ self["id"] ? self["id"] : super
38
+ end
39
+
40
+ def [](key) #:nodoc:
41
+ key = key.to_s
42
+ return Mash.new unless key?(key)
43
+ super
44
+ end
45
+
46
+ def []=(key,value) #:nodoc:
47
+ key = key.to_s
48
+ super
49
+ end
50
+
51
+ # Prints out a pretty object-like string of the
52
+ # defined attributes.
53
+ def inspect
54
+ ret = "<#{self.class.to_s}"
55
+ keys.sort.each do |key|
56
+ ret << " #{key}=#{self[key].inspect}"
57
+ end
58
+ ret << ">"
59
+ ret
60
+ end
61
+
62
+ alias :to_s :inspect
63
+
64
+ def method_missing(method_name, *args) #:nodoc:
65
+ if (match = method_name.to_s.match(/(.*)=$/)) && args.size == 1
66
+ self[match[1]] = args.first
67
+ elsif (match = method_name.to_s.match(/(.*)\?$/)) && args.size == 0
68
+ key?(match[1])
69
+ elsif keys.include?(method_name.to_s)
70
+ self[method_name]
71
+ elsif match = method_name.to_s.match(/^([a-z][a-z0-9A-Z_]+)$/)
72
+ Mash.new
73
+ else
74
+ super
75
+ end
76
+ end
77
+
78
+ private
79
+
80
+ def mash_a_hash(hash) #:nodoc:
81
+ hash.each do |k,v|
82
+ case v
83
+ when Hash
84
+ v = Mash.new(v) if v.is_a?(Hash)
85
+ when Array
86
+ v = collect_mashed_hashes_in(v) if v.is_a?(Array)
87
+ end
88
+
89
+ self[k] = v
90
+ end
91
+ end
92
+
93
+ def collect_mashed_hashes_in(array) #:nodoc:
94
+ array.collect do |value|
95
+ case value
96
+ when Hash
97
+ Mash.new(value)
98
+ when Array
99
+ collect_mashed_hashes_in(value)
100
+ else
101
+ value
102
+ end
103
+ end
104
+ end
105
+ end
@@ -0,0 +1,60 @@
1
+ require File.join(File.dirname(__FILE__),"..","lib","mash")
2
+ require File.join(File.dirname(__FILE__),"spec_helper")
3
+
4
+ describe Mash do
5
+ before(:each) do
6
+ @mash = Mash.new
7
+ end
8
+
9
+ it "should inherit from hash" do
10
+ @mash.is_a?(Hash).should be_true
11
+ end
12
+
13
+ it "should be able to set hash values through method= calls" do
14
+ @mash.test = "abc"
15
+ @mash["test"].should == "abc"
16
+ end
17
+
18
+ it "should be able to retrieve set values through method calls" do
19
+ @mash["test"] = "abc"
20
+ @mash.test.should == "abc"
21
+ end
22
+
23
+ it "should test for already set values when passed a ? method" do
24
+ @mash.test?.should be_false
25
+ @mash.test = "abc"
26
+ @mash.test?.should be_true
27
+ end
28
+
29
+ it "should make all [] and []= into strings for consistency" do
30
+ @mash["abc"] = 123
31
+ @mash.key?('abc').should be_true
32
+ @mash["abc"].should == 123
33
+ end
34
+
35
+ it "should have a to_s that is identical to its inspect" do
36
+ @mash.abc = 123
37
+ @mash.to_s.should == @mash.inspect
38
+ end
39
+
40
+ context "#initialize" do
41
+ it "should convert an existing hash to a Mash" do
42
+ converted = Mash.new({:abc => 123, :name => "Bob"})
43
+ converted.abc.should == 123
44
+ converted.name.should == "Bob"
45
+ end
46
+
47
+ it "should convert hashes recursively into mashes" do
48
+ converted = Mash.new({:a => {:b => 1, :c => {:d => 23}}})
49
+ converted.a.is_a?(Mash).should be_true
50
+ converted.a.b.should == 1
51
+ converted.a.c.d.should == 23
52
+ end
53
+
54
+ it "should convert hashes in arrays into mashes" do
55
+ converted = Mash.new({:a => [{:b => 12}, 23]})
56
+ converted.a.first.b.should == 12
57
+ converted.a.last.should == 23
58
+ end
59
+ end
60
+ end
@@ -0,0 +1 @@
1
+ require File.join(File.dirname(__FILE__),"..","lib","mash")
metadata ADDED
@@ -0,0 +1,71 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mash
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Michael Bleigh
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2008-04-12 00:00:00 -04:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: hoe
17
+ version_requirement:
18
+ version_requirements: !ruby/object:Gem::Requirement
19
+ requirements:
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 1.5.1
23
+ version:
24
+ description: Mash is an extended Hash that gives simple pseudo-object functionality that can be built from hashes and easily extended. It is designed to be used in RESTful API libraries to provide easy object-like access to JSON and XML parsed hashes.
25
+ email:
26
+ - michael@intridea.com
27
+ executables: []
28
+
29
+ extensions: []
30
+
31
+ extra_rdoc_files:
32
+ - History.txt
33
+ - Manifest.txt
34
+ - README.txt
35
+ files:
36
+ - History.txt
37
+ - Manifest.txt
38
+ - README.txt
39
+ - Rakefile
40
+ - lib/mash.rb
41
+ - spec/mash_spec.rb
42
+ - spec/spec_helper.rb
43
+ has_rdoc: true
44
+ homepage: http://github.com/mbleigh/mash
45
+ post_install_message:
46
+ rdoc_options:
47
+ - --main
48
+ - README.txt
49
+ require_paths:
50
+ - lib
51
+ required_ruby_version: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: "0"
56
+ version:
57
+ required_rubygems_version: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: "0"
62
+ version:
63
+ requirements: []
64
+
65
+ rubyforge_project: mash-hash
66
+ rubygems_version: 1.1.0
67
+ signing_key:
68
+ specification_version: 2
69
+ summary: Mash is an extended Hash that gives simple pseudo-object functionality that can be built from hashes and easily extended
70
+ test_files: []
71
+