shash 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/LICENSE ADDED
@@ -0,0 +1,6 @@
1
+ COPYLEFT
2
+
3
+ 0. the freedom to use the work,
4
+ 1. the freedom to study the work,
5
+ 2. the freedom to copy and share the work with others,
6
+ 3. the freedom to modify the work, and the freedom to distribute modified and therefore derivative works.
data/README ADDED
@@ -0,0 +1,35 @@
1
+ Shash
2
+ =====
3
+ Shash provides quick way to handle configuration file, settings or other form of key/value store. It's based
4
+ on a single hash, but lets you set/read keys like attributes. Shash stands for StructHash or, for intimates,
5
+ SuperHash.
6
+
7
+ Installation
8
+ ------------
9
+ gem install shash
10
+
11
+ Test
12
+ ----
13
+ rspec test/test_shash.rb
14
+
15
+ Usage
16
+ -----
17
+ Here his the simpliest scenario
18
+ Settings = Shash.new({"name"=>"Shash!", "application"=>{"version"=>1}})
19
+ Settings.name #=> "Shash!"
20
+ Settings.application #=> {"version"=>1}
21
+ Settings.application.version #=> 1
22
+
23
+ From a hash, it could not be simplier
24
+ Settings = {"name"=>"Shash!"}.to_shash
25
+ Settings.name #=> "Shash!"
26
+
27
+ You can of course set values directly from a Shash object
28
+ Settings = Shash.new
29
+ Settings.respond_to?("name") #=> false
30
+ Settings.name = "Shash!"
31
+ Settings.respond_to?("name") #=> true
32
+ Settings.name #=> "Shash!"
33
+
34
+ From a YAML file, or any other key/value kind of file
35
+ Settings = YAML.load_file( "path/to/your/file.yml" ).to_shash
data/lib/shash.rb ADDED
@@ -0,0 +1,40 @@
1
+ class Shash
2
+ attr_reader :hash
3
+
4
+ def initialize(hash={})
5
+ @hash = hash
6
+ end
7
+
8
+ def method_missing(key, *args, &block)
9
+ if key[/=$/]
10
+ @hash[key[0...-1]] = args.first
11
+ else
12
+ if value = @hash[key.to_s]
13
+ case value
14
+ when Hash
15
+ Shash.new(value)
16
+ else
17
+ value
18
+ end
19
+ else
20
+ @hash.send(key, *args, &block)
21
+ end
22
+ end
23
+ end
24
+
25
+ def respond_to?(key)
26
+ @hash.has_key?(key.to_s)
27
+ end
28
+ alias_method :has_key?, :respond_to?
29
+ alias_method :key?, :respond_to?
30
+
31
+ def == other
32
+ @hash == other.hash
33
+ end
34
+ end
35
+
36
+ class Hash
37
+ def to_shash
38
+ Shash.new(self)
39
+ end
40
+ end
data/lib/version.rb ADDED
@@ -0,0 +1,7 @@
1
+ class Shash
2
+ MAJOR = 0
3
+ MINOR = 0
4
+ BUILD = 1
5
+
6
+ VERSION = "#{MAJOR}.#{MINOR}.#{BUILD}"
7
+ end
data/shash.gemspec ADDED
@@ -0,0 +1,20 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib/', __FILE__)
3
+ $:.unshift lib unless $:.include?(lib)
4
+
5
+ require './lib/version'
6
+
7
+ Gem::Specification.new do |s|
8
+ s.name = "shash"
9
+ s.version = Shash::VERSION
10
+ s.platform = Gem::Platform::RUBY
11
+ s.authors = ["Christian Blais"]
12
+ s.email = ["christ.blais@gmail.com"]
13
+ s.homepage = "http://github.com/christianblais/shash"
14
+ s.summary = "Replace hash keys with method calls"
15
+ s.description = "Replace hash keys with method calls"
16
+
17
+ s.files = `git ls-files`.split("\n")
18
+
19
+ s.require_paths = ['lib', 'test']
20
+ end
@@ -0,0 +1,33 @@
1
+ require File.join(File.dirname(__FILE__), "..", "lib", "shash")
2
+
3
+ describe Hash do
4
+ it "#to_shash should returns a new Shash object" do
5
+ {"a"=>1}.to_shash.should == Shash.new({"a"=>1})
6
+ end
7
+ end
8
+
9
+ describe Shash do
10
+ it "should accesses hash values through method calls" do
11
+ h = {"a"=>1, "b"=>{"c"=>2}}.to_shash
12
+ h.a.should == 1
13
+ h.b.should == {"c"=>2}.to_shash
14
+ h.b.c.should == 2
15
+ end
16
+
17
+ it "#method=(value) should set a new key with corresponding value" do
18
+ h = {}.to_shash
19
+ h.y = nil
20
+ h.should == {"y"=>nil}.to_shash
21
+ h.y = {}
22
+ h.should == {"y"=>{}}.to_shash
23
+ h.y.z = 0
24
+ h.should == {"y"=>{"z"=>0}}.to_shash
25
+ end
26
+
27
+ it "#respond_to? should check for key existence correctly" do
28
+ h = {"a"=>1, "b"=>{"c"=>2}}.to_shash
29
+ h.respond_to?("a").should == true
30
+ h.has_key?("b").should == true
31
+ h.b.key?("c").should == true
32
+ end
33
+ end
metadata ADDED
@@ -0,0 +1,52 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: shash
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Christian Blais
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-08-31 00:00:00.000000000Z
13
+ dependencies: []
14
+ description: Replace hash keys with method calls
15
+ email:
16
+ - christ.blais@gmail.com
17
+ executables: []
18
+ extensions: []
19
+ extra_rdoc_files: []
20
+ files:
21
+ - LICENSE
22
+ - README
23
+ - lib/shash.rb
24
+ - lib/version.rb
25
+ - shash.gemspec
26
+ - test/test_shash.rb
27
+ homepage: http://github.com/christianblais/shash
28
+ licenses: []
29
+ post_install_message:
30
+ rdoc_options: []
31
+ require_paths:
32
+ - lib
33
+ - test
34
+ required_ruby_version: !ruby/object:Gem::Requirement
35
+ none: false
36
+ requirements:
37
+ - - ! '>='
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ required_rubygems_version: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ requirements: []
47
+ rubyforge_project:
48
+ rubygems_version: 1.8.8
49
+ signing_key:
50
+ specification_version: 3
51
+ summary: Replace hash keys with method calls
52
+ test_files: []