dynahash 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.
Files changed (4) hide show
  1. data/LICENSE +27 -0
  2. data/lib/dynahash.rb +34 -0
  3. data/test/test.rb +68 -0
  4. metadata +71 -0
data/LICENSE ADDED
@@ -0,0 +1,27 @@
1
+ DynaHash Ruby Gem
2
+ Copyright (c) 2010, Tony Heupel, All Rights Reserved
3
+
4
+ =====================================================
5
+ Licensed under the MIT License:
6
+
7
+ The MIT License
8
+
9
+ Copyright (c) 2010 Tony Heupel
10
+
11
+ Permission is hereby granted, free of charge, to any person obtaining a copy
12
+ of this software and associated documentation files (the "Software"), to deal
13
+ in the Software without restriction, including without limitation the rights
14
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
15
+ copies of the Software, and to permit persons to whom the Software is
16
+ furnished to do so, subject to the following conditions:
17
+
18
+ The above copyright notice and this permission notice shall be included in
19
+ all copies or substantial portions of the Software.
20
+
21
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
24
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
26
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
27
+ THE SOFTWARE.
@@ -0,0 +1,34 @@
1
+ # = DynaHash
2
+ # (c) 2010 Tony Heupel
3
+ #
4
+ # An extension to Ruby's Hash class that allows for dot-notation
5
+ # access to a Hash's keys as if they were just properties on the
6
+ # object.
7
+ # It ignores:
8
+ # * @ (xml-simple gem attribute prefix)
9
+ # * : (symbol notation)
10
+ # * - (dash in name)
11
+ #
12
+ # It replaces spaces with underscores to more closely resemble
13
+ # a property name.
14
+ #
15
+ # Based off of my .NET/C# HyperDynamo work at
16
+ # http://github.com/tonyheupel/hypercore
17
+ #
18
+ class Hash
19
+
20
+ def method_missing(m, *args, &block)
21
+ self.fetch(find_member(m))
22
+ end
23
+
24
+ private
25
+
26
+ def find_member(m)
27
+ # get the first key that matches the test
28
+ # if none of the keys match, just return
29
+ # the original name passed in and let the
30
+ # caller handle it.
31
+ name = m.to_s
32
+ self.keys.find(name) { |key| key.to_s.gsub(/(@|:|\-)/, '').gsub(' ', '_').casecmp(name) == 0 }
33
+ end
34
+ end
@@ -0,0 +1,68 @@
1
+ # !/usr/bin/env/ ruby
2
+ require "test/unit"
3
+
4
+ require "../lib/dynahash"
5
+
6
+ class TestDynaHash < Test::Unit::TestCase
7
+ def test_case_matches
8
+ h = {'UserName' => 'tonyheupel', 'Password' => 'yeah, right'}
9
+
10
+ assert_equal('tonyheupel', h.UserName)
11
+ assert_equal(h['UserName'], h.UserName)
12
+
13
+ assert_equal('yeah, right', h.Password)
14
+ assert_equal(h['Password'], h.Password)
15
+
16
+ end
17
+
18
+ def test_case_insensitive
19
+ h = {'UserName' => 'tonyheupel', 'Password' => 'yeah, right'}
20
+
21
+ assert_equal('tonyheupel', h.username)
22
+ assert_equal('tonyheupel', h.uSERnaMe)
23
+
24
+ assert_equal('yeah, right', h.password)
25
+ assert_equal('yeah, right', h.pASSwOrD)
26
+ end
27
+
28
+ def test_replace_space_with_underscore
29
+ h = {'Tony Heupel' => 'cool', 'Zed Shaw' => 'coolest'}
30
+
31
+ assert_equal('cool', h.Tony_Heupel)
32
+ assert_equal(h['Tony Heupel'], h.Tony_Heupel)
33
+
34
+ assert_equal('coolest', h.Zed_Shaw)
35
+ assert_equal(h['Zed Shaw'], h.Zed_Shaw)
36
+ end
37
+
38
+ def test_remove_at_symbol
39
+ h = {'@name' => 'Tony', 'gen@der' => :male}
40
+
41
+ assert_equal('Tony', h.name)
42
+ assert_equal(:male, h.gender)
43
+ end
44
+
45
+ def test_remove_colon_symbol
46
+ h = {:name => 'Tony', 'gen:der' => :male}
47
+
48
+ assert_equal('Tony', h.name)
49
+ assert_equal(:male, h.gender)
50
+ end
51
+
52
+ def test_remove_dash_symbol
53
+ h = {'My-Name-Is' => 'Slim Shady', '-gender-' => :male}
54
+
55
+ assert_equal('Slim Shady', h.MyNameIs)
56
+ assert_equal(:male, h.gender)
57
+ end
58
+
59
+ def test_all_removals_and_replacements_together
60
+ h = {'@name' => 'Tony', 'Person Gender' => :male, :dude_type => 'coolness', '-w:T@@F--' => 'um, ok' }
61
+
62
+ assert_equal('Tony', h.name)
63
+ assert_equal(:male, h.person_gender)
64
+ assert_equal('coolness', h.dude_type)
65
+ assert_equal('um, ok', h.WTF)
66
+
67
+ end
68
+ end
metadata ADDED
@@ -0,0 +1,71 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dynahash
3
+ version: !ruby/object:Gem::Version
4
+ hash: 9
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 1
9
+ version: "0.1"
10
+ platform: ruby
11
+ authors:
12
+ - Tony Heupel
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2010-10-17 00:00:00 -07:00
18
+ default_executable:
19
+ dependencies: []
20
+
21
+ description: DynaHash changs the Hash class method_missing to see if it can map the property being accessed to a key in the Hash itself. It saves typing and looks more like a regular object instance.
22
+ email:
23
+ - tonyheupel@gmail.com
24
+ executables: []
25
+
26
+ extensions: []
27
+
28
+ extra_rdoc_files: []
29
+
30
+ files:
31
+ - lib/dynahash.rb
32
+ - LICENSE
33
+ - test/test.rb
34
+ has_rdoc: true
35
+ homepage: http://github.com/tonyheupel/dynahash
36
+ licenses: []
37
+
38
+ post_install_message:
39
+ rdoc_options: []
40
+
41
+ require_paths:
42
+ - lib
43
+ required_ruby_version: !ruby/object:Gem::Requirement
44
+ none: false
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ hash: 3
49
+ segments:
50
+ - 0
51
+ version: "0"
52
+ required_rubygems_version: !ruby/object:Gem::Requirement
53
+ none: false
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ hash: 21
58
+ segments:
59
+ - 1
60
+ - 3
61
+ - 7
62
+ version: 1.3.7
63
+ requirements: []
64
+
65
+ rubyforge_project: dynahash
66
+ rubygems_version: 1.3.7
67
+ signing_key:
68
+ specification_version: 3
69
+ summary: Reference Hash keys as if they were dot-notation properties
70
+ test_files:
71
+ - test/test.rb