mostash 0.0.1

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/README.markdown ADDED
File without changes
data/Rakefile ADDED
@@ -0,0 +1,23 @@
1
+ require 'rubygems'
2
+ require 'spec/rake/spectask'
3
+
4
+ begin
5
+ require 'jeweler'
6
+ Jeweler::Tasks.new do |gemspec|
7
+ gemspec.name = "mostash"
8
+ gemspec.summary = "A combo of OpenStruct and a ruby hash"
9
+ gemspec.description = "You can treat an object as either a hash or as an OpenStruct. In additon to this you can create them nested, unlike OpenStruct"
10
+ gemspec.email = "asher.friedman@gmail.com"
11
+ #gemspec.homepage = "http://github.com/technicalpickles/the-perfect-gem"
12
+ gemspec.authors = ["Joel Friedman"]
13
+
14
+ gemspec.add_development_dependency "rspec"
15
+ end
16
+ rescue LoadError
17
+ puts "Jeweler not available. Install it with: gem install jeweler"
18
+ end
19
+
20
+ desc "run all specs"
21
+ Spec::Rake::SpecTask.new( "spec" ) do |t|
22
+ t.spec_files = FileList["spec/**/*_spec.rb"]
23
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.1
data/lib/mostash.rb ADDED
@@ -0,0 +1,8 @@
1
+ require 'ostruct'
2
+
3
+ require File.join(File.dirname(__FILE__), "mostash", "mostash")
4
+
5
+ def dbg( msg )
6
+ file_name = __FILE__.split( '/' ).last
7
+ puts "#{file_name} ##{__LINE__}: #{msg}"
8
+ end
@@ -0,0 +1,43 @@
1
+ class MoStash < OpenStruct
2
+ def initialize(init={})
3
+ super({})
4
+ __init__ init
5
+ end
6
+
7
+ def method_missing(method_name, *args)
8
+ #dbg "#{method_name} was sent #{args.inspect}"
9
+ if __is_setter__( method_name )
10
+ super method_name, __adjusted_value__( args.first )
11
+ else
12
+ super
13
+ end
14
+ end
15
+
16
+ def []=(key, value)
17
+ self.send "#{key.to_s}=", value
18
+ end
19
+
20
+ def [](key)
21
+ self.send "#{key.to_s}"
22
+ end
23
+
24
+ private
25
+
26
+ def __init__(hash)
27
+ hash.each_pair do |key, value|
28
+ self.send "#{key.to_s}=", __adjusted_value__( value )
29
+ end
30
+ end
31
+
32
+ def __adjusted_value__(value)
33
+ case value
34
+ when Hash then MoStash.new( value )
35
+ when Array then value.map{ |v| __adjusted_value__( v ) }
36
+ else value
37
+ end
38
+ end
39
+
40
+ def __is_setter__(method_name)
41
+ method_name.to_s =~ /=$/
42
+ end
43
+ end
@@ -0,0 +1,63 @@
1
+ require 'spec_helper'
2
+
3
+ describe MoStash do
4
+
5
+ it "should act like basic OpenStruct" do
6
+ mo = MoStash.new
7
+ mo.foo = "bar"
8
+
9
+ mo.foo.should == "bar"
10
+ end
11
+
12
+ it "should allow basic Hash methods" do
13
+ mo = MoStash.new
14
+ mo.foo = "bar"
15
+ mo[:baz] = "foo"
16
+
17
+ mo[:foo].should == "bar"
18
+ mo.baz.should == "foo"
19
+ end
20
+
21
+ it "should be initializable via a Hash" do
22
+ mo = MoStash.new(:foo => "bar")
23
+
24
+ mo.foo.should == "bar"
25
+ end
26
+
27
+ it "should be initializable via nested Hash" do
28
+ h = {:foo => {:bar => "baz"}, :oh => "hai"}
29
+ mo = MoStash.new h
30
+
31
+ mo.foo.bar.should == "baz"
32
+ mo.oh.should == "hai"
33
+ end
34
+
35
+ it "should allow values to be arrays" do
36
+ mo = MoStash.new
37
+ mo.foo = ['hello']
38
+
39
+ mo.foo.first.should == "hello"
40
+ end
41
+
42
+ it "should automatically make a hash a MoStash" do
43
+ mo = MoStash.new
44
+ mo.foo = {:bar => 'baz'}
45
+
46
+ mo.foo.bar.should == 'baz'
47
+ end
48
+
49
+ it "should correctly handle an array of hashes" do
50
+ mo = MoStash.new
51
+ mo.foo = [{:hey => 'you'}, {:oh => 'hai'}]
52
+
53
+ mo.foo[1].oh.should == 'hai'
54
+ end
55
+
56
+ it "should create method when new method called" do
57
+ mo = MoStash.new
58
+ mo.foo = "bar"
59
+
60
+ mo.methods.should include("foo")
61
+ end
62
+
63
+ end
@@ -0,0 +1,4 @@
1
+ require File.join(File.dirname(__FILE__), "..", "lib", "mostash")
2
+
3
+ require 'rubygems'
4
+ require 'spec'
metadata ADDED
@@ -0,0 +1,80 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mostash
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 0
8
+ - 1
9
+ version: 0.0.1
10
+ platform: ruby
11
+ authors:
12
+ - Joel Friedman
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2010-05-02 00:00:00 -05:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: rspec
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ segments:
28
+ - 0
29
+ version: "0"
30
+ type: :development
31
+ version_requirements: *id001
32
+ description: You can treat an object as either a hash or as an OpenStruct. In additon to this you can create them nested, unlike OpenStruct
33
+ email: asher.friedman@gmail.com
34
+ executables: []
35
+
36
+ extensions: []
37
+
38
+ extra_rdoc_files:
39
+ - README.markdown
40
+ files:
41
+ - README.markdown
42
+ - Rakefile
43
+ - VERSION
44
+ - lib/mostash.rb
45
+ - lib/mostash/mostash.rb
46
+ - spec/mostash_spec.rb
47
+ - spec/spec_helper.rb
48
+ has_rdoc: true
49
+ homepage:
50
+ licenses: []
51
+
52
+ post_install_message:
53
+ rdoc_options:
54
+ - --charset=UTF-8
55
+ require_paths:
56
+ - lib
57
+ required_ruby_version: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ segments:
62
+ - 0
63
+ version: "0"
64
+ required_rubygems_version: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ segments:
69
+ - 0
70
+ version: "0"
71
+ requirements: []
72
+
73
+ rubyforge_project:
74
+ rubygems_version: 1.3.6
75
+ signing_key:
76
+ specification_version: 3
77
+ summary: A combo of OpenStruct and a ruby hash
78
+ test_files:
79
+ - spec/mostash_spec.rb
80
+ - spec/spec_helper.rb