hash-access 0.1.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2007,2008 Slava Chernobai <chernobai@gmail.com>
1
+ Copyright (c) 2007,2008,2011 Svetoslav Chernobay <slava@chernobay.info>
2
2
 
3
3
  This is free software. You may redistribute copies of it under the terms
4
4
  of the GNU General Public License.
@@ -0,0 +1,58 @@
1
+ # HashAccess
2
+
3
+ [HashAccess](https://github.com/slavach/hash-access) allows access to hash
4
+ elements by calling methods. When using HashAccess you can call a method
5
+ on a hash instance to get the corresponding value of a key.
6
+
7
+ You can write:
8
+
9
+ hash.some_key = 'something'
10
+
11
+ instead of:
12
+
13
+ hash['some_key'] = 'something'
14
+
15
+ ## Installation
16
+
17
+ Hash access is available as the gem hash-access.
18
+
19
+ gem install hash-access
20
+
21
+ ## Usage Example
22
+
23
+ require 'hash_access'
24
+ include HashAccess
25
+
26
+ h = {}
27
+ h.access_by_methods
28
+ h.first_key = 'First value' # the same as h['first_key'] = 'First value'
29
+ h.another_key = 'Another value' # the same as h['another_key'] = 'Another value'
30
+
31
+ ## Development
32
+
33
+ Clone hash-access source from GitGub:
34
+
35
+ git clone git://github.com/slavach/hash-access.git
36
+
37
+ Install bundler if it has not been installed yet:
38
+
39
+ gem install bundler
40
+
41
+ Install additional gems for testing and documentation:
42
+
43
+ bundle install
44
+
45
+ The above command installs gems: rspec, rdoc, yard, BlueCloth.
46
+
47
+ To invoke tests - run `rake spec` or simply `rake`.
48
+
49
+ ## Author
50
+
51
+ HashAccess has been written by Svetoslav Chernobay <slava@chernobay.info>.
52
+ Feel free to contact him if you have any questions or comments.
53
+
54
+ ## Notes
55
+
56
+ HashAccess is a supplement module for UseConfig which is available at
57
+ GutHub [use-config](https://github.com/slavach/use-config) as well as the gem use-config.
58
+
data/Rakefile CHANGED
@@ -1,63 +1,38 @@
1
1
  require 'rubygems'
2
2
 
3
3
  require 'rake/clean'
4
- require 'rake/testtask'
5
4
  require 'rake/rdoctask'
6
- require 'rake/gempackagetask'
7
5
 
8
- require 'lib/hash_access'
6
+ require 'yard'
9
7
 
10
- task :default => [ :test ]
8
+ require 'rspec'
9
+ require 'rspec/core/rake_task'
11
10
 
12
- CLEAN.include(%w[ pkg/* README doc/*])
11
+ require File.dirname(__FILE__) + "/lib/hash_access/version.rb"
13
12
 
14
- desc 'Generate README'
15
- task :readme do
16
- %x[erb -T 1 README.erb > README] if File.exists?('README.erb')
17
- end
13
+ task :default => [ :spec ]
18
14
 
19
- desc 'Generate RDoc'
20
- task :rdoc => [ :readme ]
21
- Rake::RDocTask.new do |rd|
22
- rd.main = 'README'
23
- rd.title = 'HashAccess'
24
- rd.rdoc_dir = 'doc'
25
- rd.template = 'jamis'
26
- rd.options = %w[ --line-numbers --inline-source ]
27
- rd.rdoc_files.include('README', 'LICENSE', 'lib/*.rb')
28
- end
15
+ CLEAN.include(%w[ pkg doc .yardoc hash-access-*.gem ])
29
16
 
30
- desc 'Upload RDoc to site'
31
- task :rdoc_pub => [:rdoc] do
32
- sh 'rsync -ae ssh --delete doc/ slava@slava.cn:/var/www/code/htdocs/hash-access/doc/'
17
+ desc 'Run RSpec examples'
18
+ RSpec::Core::RakeTask.new :spec do |t|
19
+ t.rspec_opts = "--colour --format documentation"
20
+ t.pattern = 'spec/*.rb'
33
21
  end
34
22
 
35
- Rake::TestTask.new do |t|
36
- t.libs << 'test'
37
- t.test_files = FileList[ 'test/test*.rb' ]
38
- t.verbose = true
23
+ desc "Build the gem"
24
+ task :build do
25
+ system "gem build hash-access.gemspec"
39
26
  end
40
27
 
41
- spec = Gem::Specification.new do |s|
42
- s.name = 'hash-access'
43
- s.version = HashAccess::VERSION
44
- s.platform = Gem::Platform::RUBY
45
- s.has_rdoc = true
46
- s.extra_rdoc_files = %w[ README LICENSE ]
47
- s.rdoc_options = %w[ --main=README --line-numbers --inline-source ]
48
- s.summary = 'HashAccess. Allows access to hash elements by methods.'
49
- s.description = s.summary
50
- s.author = 'Slava Chernobai'
51
- s.email = 'chernobai@gmail.com'
52
- s.homepage = 'http://code.slava.pp.ru/hash-access/'
53
- s.files = %w[ README LICENSE Rakefile ] + Dir.glob("{lib,test}/*")
54
- s.require_path = 'lib'
28
+ desc "Push the gem to rubygems.org"
29
+ task :push do
30
+ system "gem push hash-access-#{HashAccess::VERSION}.gem"
55
31
  end
56
32
 
57
- task :gem => [ :readme ]
58
- Rake::GemPackageTask.new(spec) do |p|
59
- p.gem_spec = spec
60
- p.need_tar = true
61
- p.need_zip = true
33
+ desc "Generate documentation"
34
+ YARD::Rake::YardocTask.new :doc do |t|
35
+ t.files = %w[ README.md, LICENSE, lib/**/*.rb ]
36
+ t.options = %w[ --title HashAccess ]
62
37
  end
63
38
 
@@ -1,45 +1,56 @@
1
- module HashAccess # :nodoc:
2
- VERSION = '0.1.0'
1
+ require 'hash_access/version'
3
2
 
3
+ module HashAccess # :nodoc:
4
+ # Extends the Hash class with the access_by_methods method.
4
5
  def self.included(base)
5
6
  Hash.send :include, HashAccess::InstanceMethods
6
7
  end
7
8
 
8
- # This module contains only one method - instance method access_by_methods,
9
- # which is being added to class Hash after inclusion of
10
- # HashAccess module in any context (any module or class).
11
- # All other methods are being generated by access_by_methods.
12
- # Generated methods becomes instance methods, not the class methods as RDoc
13
- # thinks :)
9
+ # This module contains one method - access_by_methods instance method.
10
+ # The access_by_methods is added to Hash when the module HashAccess
11
+ # is being included.
12
+ # When the access_by_methods is being called it generates a couple of
13
+ # instance methods of the calling object:
14
14
  #
15
- # Below, the list of generated methods:
15
+ # * access_by_methods?
16
16
  # * store, []=
17
17
  # * method_missing
18
18
  # * stringify_keys!
19
19
  module InstanceMethods
20
- # Generates singleton instance methods,
21
- # which allows access to hash elements with methods.
20
+ # Generates singleton instance methods that allows access to any hash
21
+ # element using a method with the same name as the key.
22
+ # Recursively calls itlelf on child hashes.
22
23
  def access_by_methods
24
+ return self if self.respond_to? :access_by_methods? and self.access_by_methods?
23
25
  class << self
24
26
  alias_method :__hash_store, :store
25
27
  alias_method :__hash_assign, :[]=
26
28
 
27
- # Generated instance method. Assigns the value to key.
29
+ # Generated instance method.
30
+ # Hash elements can be accessed using methods.
31
+ def access_by_methods?
32
+ true
33
+ end
34
+
35
+ # Generated instance method.
36
+ # Stores a key-value pair.
28
37
  def store(key, value)
29
- key = key.to_s
30
- __hash_store(key, value)
31
38
  if value.is_a? Hash
32
39
  value.access_by_methods
33
40
  end
41
+ key = key.to_s
42
+ __hash_store(key, value)
34
43
  end # def store
35
44
 
36
- # Generated instance method. Assigns the value to key.
45
+ # Generated instance method.
46
+ # Stores a key-value pair.
37
47
  def []=(key, value)
38
48
  self.store(key, value)
39
49
  end # def []=
40
50
 
41
51
  # Generated instance method.
42
- # Creates new hash element with the method key.
52
+ # Creates a new hash element with a key is the same as the passed
53
+ # method.
43
54
  def method_missing(method, *values)
44
55
  method_name = method.to_s
45
56
  super(method, *values) unless method_name =~ /^[a-z0-9]+.*$/
@@ -51,12 +62,14 @@ module HashAccess # :nodoc:
51
62
  self[key] = values
52
63
  end
53
64
  else
54
- self[method_name] = Hash.new unless self.keys.include?(method_name)
65
+ self[method_name] = Hash.new.access_by_methods \
66
+ unless self.keys.include?(method_name)
55
67
  self[method_name]
56
68
  end
57
69
  end # def method_missing
58
70
 
59
- # Generated instance method. Converts all hash keys to strings.
71
+ # Generated instance method.
72
+ # Converts all hash keys to strings.
60
73
  def stringify_keys!
61
74
  keys.each do |key|
62
75
  next if key.is_a? String
@@ -69,11 +82,14 @@ module HashAccess # :nodoc:
69
82
 
70
83
  self.stringify_keys!
71
84
 
85
+ # Recursive calls
72
86
  self.each do |key, value|
73
87
  if value.is_a? Hash
74
88
  value.access_by_methods
75
89
  end
76
90
  end
91
+
92
+ self
77
93
  end # def access_by_methods
78
94
  end # module InstanceMethods
79
95
  end # module HashAccess
@@ -0,0 +1,4 @@
1
+ module HashAccess
2
+ VERSION = '0.2.1'
3
+ end
4
+
@@ -0,0 +1,91 @@
1
+ require 'rspec'
2
+ require File.dirname(__FILE__) + "/../lib/hash_access.rb"
3
+ include HashAccess
4
+
5
+ describe HashAccess do
6
+ describe "new empty Hash instance" do
7
+ it "responds to :access_by_methods" do
8
+ @hash = Hash.new
9
+ @hash.respond_to?(:access_by_methods).should == true
10
+ end
11
+ end
12
+
13
+ describe "new empty Hash instance after the call to access_by_methods" do
14
+ before :each do
15
+ @hash = Hash.new
16
+ @hash.access_by_methods
17
+ end
18
+
19
+ it "responds to :access_by_methods?" do
20
+ @hash.respond_to?(:access_by_methods?).should == true
21
+ end
22
+
23
+ it "responds to :stringify_keys!" do
24
+ @hash.respond_to?(:stringify_keys!).should == true
25
+ end
26
+ end
27
+
28
+ describe "non-empty Hash instance after the call to access_by_methods" do
29
+ before :each do
30
+ @hash = Hash.new
31
+ @hash[:qwe] = 'qwe_value'
32
+ @hash[:asd] = {}
33
+ @hash[:asd][:fgh] = :asd_fgh_value
34
+ @hash['zxc'] = {}
35
+ @hash['zxc']['vbn'] = 'zxc_vbn_value'
36
+ @hash.access_by_methods
37
+ end
38
+
39
+ it "changes symbol-type keys to strings" do
40
+ @hash.keys.sort.should == %w( asd qwe zxc )
41
+ end
42
+
43
+ it "returns a value when being call to a method" do
44
+ @hash.qwe.should == 'qwe_value'
45
+ @hash.asd.fgh.should == :asd_fgh_value
46
+ @hash.zxc.vbn.should == 'zxc_vbn_value'
47
+ end
48
+
49
+ it "changes a value" do
50
+ @hash.qwe = 'new_qwe_value'
51
+ @hash.qwe.should == 'new_qwe_value'
52
+ end
53
+
54
+ it "creates a new value when being call to a method" do
55
+ @hash.qwerty.asdfgh.zxcvbn = 'qwertyuiop'
56
+ @hash.qwerty.asdfgh.zxcvbn.should == 'qwertyuiop'
57
+ end
58
+
59
+ it "replaces the existing value" do
60
+ @hash.qwe = 'new_qwe_value'
61
+ @hash.qwe.should == 'new_qwe_value'
62
+ end
63
+
64
+ it "it replaces the existing parent element" do
65
+ @hash.qwerty.asdfgh.zxcvbn.qwerty.asdfgh.zxcvbn = 'qwertyuiop'
66
+ @hash.qwerty.asdfgh.zxcvbn = 'qwerty_asdfgh_zxcvbn'
67
+ end
68
+ end
69
+
70
+ describe "child hash" do
71
+ before :each do
72
+ @hash = {}
73
+ @hash.access_by_methods
74
+ @hash.qwe.asd = 'qwe_asd_value'
75
+ @child = @hash.qwe
76
+ end
77
+ it "responds to access_by_methods?" do
78
+ @child.respond_to?(:access_by_methods?).should == true
79
+ end
80
+
81
+ it "returns a value when being call to a method" do
82
+ @child.asd.should == 'qwe_asd_value'
83
+ end
84
+
85
+ it "creates a new element when being call to a method" do
86
+ @child.zxc = 'zxc_value'
87
+ @child.zxc.should == 'zxc_value'
88
+ end
89
+ end
90
+ end
91
+
metadata CHANGED
@@ -1,35 +1,39 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hash-access
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ prerelease:
5
+ version: 0.2.1
5
6
  platform: ruby
6
7
  authors:
7
- - Slava Chernobai
8
+ - Svetoslav Chernobay
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
12
 
12
- date: 2008-01-10 00:00:00 +03:00
13
+ date: 2011-03-08 00:00:00 +03:00
13
14
  default_executable:
14
15
  dependencies: []
15
16
 
16
- description: HashAccess. Allows access to hash elements by methods.
17
- email: chernobai@gmail.com
17
+ description: HashAccess library allows access to hash elements by calling methods
18
+ email: slava@chernobay.info
18
19
  executables: []
19
20
 
20
21
  extensions: []
21
22
 
22
23
  extra_rdoc_files:
23
- - README
24
+ - README.md
24
25
  - LICENSE
25
26
  files:
26
- - README
27
+ - README.md
27
28
  - LICENSE
28
29
  - Rakefile
29
30
  - lib/hash_access.rb
30
- - test/test_hash_access.rb
31
+ - lib/hash_access/version.rb
32
+ - spec/hash_access_spec.rb
31
33
  has_rdoc: true
32
- homepage: http://code.slava.pp.ru/hash-access/
34
+ homepage: http://github.com/slavach/hash-access
35
+ licenses: []
36
+
33
37
  post_install_message:
34
38
  rdoc_options:
35
39
  - --main=README
@@ -38,23 +42,23 @@ rdoc_options:
38
42
  require_paths:
39
43
  - lib
40
44
  required_ruby_version: !ruby/object:Gem::Requirement
45
+ none: false
41
46
  requirements:
42
47
  - - ">="
43
48
  - !ruby/object:Gem::Version
44
49
  version: "0"
45
- version:
46
50
  required_rubygems_version: !ruby/object:Gem::Requirement
51
+ none: false
47
52
  requirements:
48
53
  - - ">="
49
54
  - !ruby/object:Gem::Version
50
- version: "0"
51
- version:
55
+ version: 1.3.6
52
56
  requirements: []
53
57
 
54
- rubyforge_project:
55
- rubygems_version: 1.0.1
58
+ rubyforge_project: hash-access
59
+ rubygems_version: 1.5.2
56
60
  signing_key:
57
- specification_version: 2
58
- summary: HashAccess. Allows access to hash elements by methods.
61
+ specification_version: 3
62
+ summary: Allows access to hash elements by methods
59
63
  test_files: []
60
64
 
data/README DELETED
@@ -1,17 +0,0 @@
1
- == HashAccess 0.1.0
2
- This library allows access to hash elements by methods.
3
-
4
- Install:
5
-
6
- gem ins hash-access
7
-
8
- Usage example:
9
-
10
- require 'hash_access'
11
- include HashAccess
12
-
13
- h = Hash.new
14
- h.access_by_methods
15
- h.one.two.three = 'qwe'
16
- print(h.inspect, "\n") # => {"one"=>{"two"=>{"three"=>"qwe"}}}=> nil
17
-
@@ -1,41 +0,0 @@
1
- require 'test/unit'
2
- require 'hash_access'
3
-
4
- class HashAccessTest < Test::Unit::TestCase
5
- def setup
6
- self.class.send :include, HashAccess
7
- end
8
-
9
- def test_001_hash_must_respond_to_access_by_methods
10
- hash = {}
11
- assert_respond_to(hash, :access_by_methods)
12
- end
13
-
14
- def test_002_access_by_methods_generates_methods
15
- hash_abm = {}
16
- hash_abm.access_by_methods
17
- assert_respond_to(hash_abm, :stringify_keys!)
18
- assert_respond_to(hash_abm, :__hash_store)
19
- assert_respond_to(hash_abm, :__hash_assign)
20
- end
21
-
22
- def test_003_changes_existing_hash_instance
23
- hash_abm = {}
24
- hash_abm['first'] = {}
25
- hash_abm['first']['one'] = :first_one
26
- hash_abm[:second] = {}
27
- hash_abm[:second][:one] = :second_one
28
- hash_abm.access_by_methods
29
- assert_equal(hash_abm.keys.sort, %w[ first second ])
30
- assert_equal(hash_abm.first.one, :first_one)
31
- assert_equal(hash_abm.second.one, :second_one)
32
- end
33
-
34
- def test_004_creates_new_element_and_parent_hashes
35
- hash_abm = {}
36
- hash_abm.access_by_methods
37
- hash_abm.first.second.third.fourth = :first_second_third_fourth
38
- assert_equal(hash_abm['first']['second']['third']['fourth'], hash_abm.first.second.third.fourth)
39
- end
40
- end
41
-