hashslice 1.0.4

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/CHANGES ADDED
@@ -0,0 +1,9 @@
1
+ = 1.0.4 - 22-May-2008
2
+ * Library now managed by Daniel Berger with the kind permission of
3
+ the original author, Michael Granger.
4
+ * Added gemspec, README, MANIFEST, and CHANGES files.
5
+ * Added a Rakefile with tasks for testing and installation.
6
+ * Replaced the test suite with one based on Test::Unit.
7
+
8
+ = 1.0.3 - 9-Jun-2004
9
+ * Last release by Michael Granger
data/MANIFEST ADDED
@@ -0,0 +1,7 @@
1
+ * CHANGES
2
+ * MANIFEST
3
+ * README
4
+ * Rakefile
5
+ * hashslice.gemspec
6
+ * lib/hashslice.rb
7
+ * test/test_hashslice.rb
data/README ADDED
@@ -0,0 +1,46 @@
1
+ = Description
2
+ Slicing for Ruby hashes.
3
+
4
+ = Installation
5
+ rake test (optional)
6
+ rake install
7
+
8
+ = Synopsis
9
+ require 'hashslice'
10
+
11
+ hash = {'a' => 1, 'b' => 2, 'c' => 3}
12
+
13
+ # Slice reference
14
+ hash['a', 'b'] # -> [1, 2]
15
+ hash['a'] # -> 1
16
+
17
+ # Slice assignment
18
+ hash['a', 'b'] = 7, 8
19
+
20
+ hash # -> {'a' => 7, 'b' => 8, 'c' => 3}
21
+
22
+ = Overview
23
+ This library modifies the Hash#[] and Hash#[]= methods so that they can
24
+ handle list reference or assignment.
25
+
26
+ == Hash#[*keys]
27
+ If more than one key is provided then an array is returned. Single
28
+ keys work as before, i.e. they return a single value.
29
+
30
+ == Hash#[*keys]=(*values)
31
+ The values on the right are assigned to the keys on left on a one for one
32
+ If there are more values than keys, the extra values are dropped.
33
+
34
+ = Copyright
35
+ Copyright (c) 2001-2008, The FaerieMUD Consortium and Daniel J. Berger.
36
+ All rights reserved.
37
+
38
+ = License
39
+ This module is free software. You may use, modify, and/or redistribute this
40
+ software under the terms of the Perl Artistic License.
41
+
42
+ See http://language.perl.com/misc/Artistic.html
43
+
44
+ = Authors
45
+ Michael Granger (original author)
46
+ Daniel Berger (current maintainer)
data/Rakefile ADDED
@@ -0,0 +1,16 @@
1
+ require 'rake'
2
+ require 'rake/clean'
3
+ require 'rake/testtask'
4
+
5
+ desc "Install the pure hashslice library (non-gem)"
6
+ task :install do
7
+ cp 'lib/hashslice.rb', Config::CONFIG['sitelibdir']
8
+ end
9
+
10
+
11
+ desc "Run the tests"
12
+ Rake::TestTask.new('test') do |t|
13
+ t.warning = true
14
+ t.libs << 'lib'
15
+ t.test_files = FileList['test/*.rb']
16
+ end
data/lib/hashslice.rb ADDED
@@ -0,0 +1,50 @@
1
+ class Hash
2
+ alias :href :[]
3
+ alias :hset :[]=
4
+
5
+ # The version of this library
6
+ VERSION_HASHSLICE = '1.0.4'
7
+
8
+ # Retrieve a hash slice. If a single key is provided, returns a single
9
+ # value. If multiple keys are provided, an array of values is returned.
10
+ #
11
+ # Examples:
12
+ #
13
+ # hash = {'a', 1, 'b', 2, 'c', 3}
14
+ # hash['a'] -> 1
15
+ # hash['a', 'c'] -> [1, 3]
16
+ #
17
+ def [](*args)
18
+ if args.length == 1
19
+ href(args[0])
20
+ else
21
+ args.map{ |k| href(k) }
22
+ end
23
+ end
24
+
25
+ # Hash slice assignment. You can assign a list of values to a list of keys
26
+ # in a single operation on a one for one basis.
27
+ #
28
+ # If the number of keys exceeds the number of values, the remaining keys
29
+ # are assigned a value of nil.
30
+ #
31
+ # If the number of values exceeds the number of keys, the extra values are
32
+ # dropped.
33
+ #
34
+ # Examples:
35
+ #
36
+ # hash['a'] = 1, 2 -> {a => [1, 2]}
37
+ # hash['a', 'b'] = 3, 4 -> {a => 3, b => 4}
38
+ # hash['a', 'b'] = 5 -> {a => 5, b => nil}
39
+ # hash['a', 'b'] = 3, 4, 5 -> {a => 3, b => 4}
40
+ #
41
+ def []=(*args)
42
+ if args.length <= 2
43
+ hset(*args)
44
+ else
45
+ values = args.pop # Last arg is the value. The rest are keys.
46
+ values = [values] unless values.is_a?(Array)
47
+ args.each_index{ |i| hset(args[i], values[i]) }
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,79 @@
1
+ #######################################################################
2
+ # test_hashslice.rb
3
+ #
4
+ # Test suite for the hashslice library. You should run these tests
5
+ # via the 'rake test' task.
6
+ #######################################################################
7
+ require 'hashslice'
8
+ require 'test/unit'
9
+
10
+ class TC_Hashslice < Test::Unit::TestCase
11
+ def setup
12
+ @hash = {'a', 1, 'b', 2}
13
+ end
14
+
15
+ def test_get_slice_instance_method_basic
16
+ assert_respond_to(@hash, :[])
17
+ assert_nothing_raised{ @hash['a'] }
18
+ assert_nothing_raised{ @hash['a', 'b'] }
19
+ assert_kind_of(Integer, @hash['a'])
20
+ assert_kind_of(Array, @hash['a', 'b'])
21
+ end
22
+
23
+ def test_get_slice_instance_method
24
+ assert_equal(1, @hash['a'])
25
+ assert_equal([1, 2], @hash['a', 'b'])
26
+ assert_equal([1, 2, nil], @hash['a', 'b', 'c'])
27
+ assert_nil(@hash['bogus'])
28
+ end
29
+
30
+ def test_get_slice_duplicate_keys
31
+ assert_equal([1, 1], @hash['a', 'a'])
32
+ assert_equal([1, 2, 1, 2], @hash['a', 'b', 'a', 'b'])
33
+ end
34
+
35
+ def test_set_slice_instance_method_basic
36
+ assert_respond_to(@hash, :[]=)
37
+ assert_nothing_raised{ @hash['a'] = 3 }
38
+ assert_nothing_raised{ @hash['a', 'b'] = 3 }
39
+ assert_nothing_raised{ @hash['a', 'b'] = 3, 4 }
40
+ assert_kind_of(Fixnum, @hash['a'] = 3)
41
+ assert_kind_of(Fixnum, @hash['a', 'b'] = 3)
42
+ assert_kind_of(Fixnum, @hash['a', 'b'] = 3, 4)
43
+ end
44
+
45
+ # hash[key] = value
46
+ def test_set_slice_instance_method_single_key_and_value
47
+ assert_nothing_raised{ @hash['a'] = 3 }
48
+ assert_nothing_raised{ @hash['b'] = [1, 2] }
49
+ assert_equal({'a' => 3, 'b' => [1, 2]}, @hash)
50
+ end
51
+
52
+ # hash[key1, key2] = value
53
+ def test_set_slice_instance_method_multiple_keys_single_value
54
+ assert_nothing_raised{ @hash['a', 'b'] = 3 }
55
+ assert_equal({'a' => 3, 'b' => nil}, @hash)
56
+ end
57
+
58
+ # hash[key1, key2] = value1, value2
59
+ def test_set_slice_instance_method_multiple_keys_multiple_values
60
+ assert_nothing_raised{ @hash['a', 'b'] = 3, 4 }
61
+ assert_equal({'a' => 3, 'b' => 4}, @hash)
62
+ end
63
+
64
+ # hash[key] = value1, value2
65
+ def test_set_slice_instance_method_single_key_multiple_values
66
+ assert_nothing_raised{ @hash['a'] = 3, 4 }
67
+ assert_equal({'a' => [3, 4], 'b' => 2}, @hash)
68
+ end
69
+
70
+ # hash[key1, key2] = value1, value2, value3
71
+ def test_set_slice_instance_method_multiple_keys_odd_values
72
+ assert_nothing_raised{ @hash['a', 'b'] = 3, 4, 5 }
73
+ assert_equal({'a' => 3, 'b' => 4}, @hash)
74
+ end
75
+
76
+ def teardown
77
+ @hash = nil
78
+ end
79
+ end
metadata ADDED
@@ -0,0 +1,60 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: hashslice
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.4
5
+ platform: ruby
6
+ authors:
7
+ - Daniel J. Berger
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2008-05-23 00:00:00 -06:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description:
17
+ email: djberg96@gmail.com
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files:
23
+ - README
24
+ - CHANGES
25
+ - MANIFEST
26
+ files:
27
+ - lib/hashslice.rb
28
+ - CHANGES
29
+ - MANIFEST
30
+ - README
31
+ - Rakefile
32
+ - test/test_hashslice.rb
33
+ has_rdoc: true
34
+ homepage: http://www.rubyforge.org/projects/shards
35
+ post_install_message:
36
+ rdoc_options: []
37
+
38
+ require_paths:
39
+ - lib
40
+ required_ruby_version: !ruby/object:Gem::Requirement
41
+ requirements:
42
+ - - ">="
43
+ - !ruby/object:Gem::Version
44
+ version: "0"
45
+ version:
46
+ required_rubygems_version: !ruby/object:Gem::Requirement
47
+ requirements:
48
+ - - ">="
49
+ - !ruby/object:Gem::Version
50
+ version: "0"
51
+ version:
52
+ requirements: []
53
+
54
+ rubyforge_project: shards
55
+ rubygems_version: 1.1.1
56
+ signing_key:
57
+ specification_version: 2
58
+ summary: An easy way to implement the facade pattern in your class
59
+ test_files:
60
+ - test/test_hashslice.rb