hashery 1.5.0 → 2.0.0
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/.ruby +30 -17
- data/.yardopts +1 -0
- data/Config.rb +28 -0
- data/{QED.rdoc → DEMO.rdoc} +0 -0
- data/HISTORY.rdoc +37 -0
- data/LICENSE.txt +26 -0
- data/NOTICE.txt +46 -0
- data/README.rdoc +10 -7
- data/lib/hashery.rb +6 -6
- data/lib/hashery.yml +30 -17
- data/lib/hashery/association.rb +169 -109
- data/lib/hashery/casting_hash.rb +128 -135
- data/lib/hashery/core_ext.rb +89 -61
- data/lib/hashery/crud_hash.rb +365 -0
- data/lib/hashery/dictionary.rb +545 -345
- data/lib/hashery/fuzzy_hash.rb +177 -125
- data/lib/hashery/ini_hash.rb +321 -0
- data/lib/hashery/key_hash.rb +54 -179
- data/lib/hashery/linked_list.rb +245 -191
- data/lib/hashery/lru_hash.rb +292 -202
- data/lib/hashery/open_cascade.rb +133 -78
- data/lib/hashery/open_hash.rb +127 -61
- data/lib/hashery/ordered_hash.rb +128 -122
- data/lib/hashery/path_hash.rb +238 -0
- data/lib/hashery/property_hash.rb +144 -80
- data/lib/hashery/query_hash.rb +85 -29
- data/lib/hashery/stash.rb +7 -3
- data/lib/hashery/static_hash.rb +46 -41
- data/test/case_association.rb +65 -4
- data/test/case_dictionary.rb +149 -5
- data/test/{case_keyhash.rb → case_key_hash.rb} +20 -14
- data/test/case_lru_hash.rb +162 -0
- data/test/{case_opencascade.rb → case_open_cascade.rb} +4 -8
- data/test/case_open_hash.rb +87 -0
- data/test/case_query_hash.rb +226 -0
- data/test/helper.rb +8 -0
- metadata +33 -63
- data/COPYING.rdoc +0 -45
- data/lib/hashery/basic_object.rb +0 -74
- data/lib/hashery/basic_struct.rb +0 -288
- data/lib/hashery/basicobject.rb +0 -1
- data/lib/hashery/basicstruct.rb +0 -1
- data/lib/hashery/castinghash.rb +0 -1
- data/lib/hashery/fuzzyhash.rb +0 -1
- data/lib/hashery/ini.rb +0 -268
- data/lib/hashery/keyhash.rb +0 -1
- data/lib/hashery/linkedlist.rb +0 -1
- data/lib/hashery/lruhash.rb +0 -1
- data/lib/hashery/memoizer.rb +0 -64
- data/lib/hashery/open_object.rb +0 -1
- data/lib/hashery/opencascade.rb +0 -1
- data/lib/hashery/openhash.rb +0 -1
- data/lib/hashery/openobject.rb +0 -1
- data/lib/hashery/orderedhash.rb +0 -1
- data/lib/hashery/ostructable.rb +0 -186
- data/lib/hashery/propertyhash.rb +0 -1
- data/lib/hashery/queryhash.rb +0 -1
- data/lib/hashery/statichash.rb +0 -1
- data/qed/01_openhash.rdoc +0 -57
- data/qed/02_queryhash.rdoc +0 -21
- data/qed/03_castinghash.rdoc +0 -13
- data/qed/04_statichash.rdoc +0 -22
- data/qed/05_association.rdoc +0 -59
- data/qed/06_opencascade.rdoc +0 -58
- data/qed/07_fuzzyhash.rdoc +0 -141
- data/qed/08_properyhash.rdoc +0 -38
- data/qed/09_ostructable.rdoc +0 -56
- data/qed/applique/ae.rb +0 -1
- data/test/case_basicstruct.rb +0 -192
- data/test/case_openhash.rb +0 -22
data/test/helper.rb
ADDED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hashery
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -15,22 +15,11 @@ authors:
|
|
15
15
|
autorequire:
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
|
-
date:
|
18
|
+
date: 2012-06-19 00:00:00.000000000 Z
|
19
19
|
dependencies:
|
20
|
-
- !ruby/object:Gem::Dependency
|
21
|
-
name: blankslate
|
22
|
-
requirement: &26633440 !ruby/object:Gem::Requirement
|
23
|
-
none: false
|
24
|
-
requirements:
|
25
|
-
- - ! '>='
|
26
|
-
- !ruby/object:Gem::Version
|
27
|
-
version: '0'
|
28
|
-
type: :runtime
|
29
|
-
prerelease: false
|
30
|
-
version_requirements: *26633440
|
31
20
|
- !ruby/object:Gem::Dependency
|
32
21
|
name: detroit
|
33
|
-
requirement: &
|
22
|
+
requirement: &19204020 !ruby/object:Gem::Requirement
|
34
23
|
none: false
|
35
24
|
requirements:
|
36
25
|
- - ! '>='
|
@@ -38,10 +27,10 @@ dependencies:
|
|
38
27
|
version: '0'
|
39
28
|
type: :development
|
40
29
|
prerelease: false
|
41
|
-
version_requirements: *
|
30
|
+
version_requirements: *19204020
|
42
31
|
- !ruby/object:Gem::Dependency
|
43
32
|
name: qed
|
44
|
-
requirement: &
|
33
|
+
requirement: &19203280 !ruby/object:Gem::Requirement
|
45
34
|
none: false
|
46
35
|
requirements:
|
47
36
|
- - ! '>='
|
@@ -49,10 +38,10 @@ dependencies:
|
|
49
38
|
version: '0'
|
50
39
|
type: :development
|
51
40
|
prerelease: false
|
52
|
-
version_requirements: *
|
41
|
+
version_requirements: *19203280
|
53
42
|
- !ruby/object:Gem::Dependency
|
54
43
|
name: lemon
|
55
|
-
requirement: &
|
44
|
+
requirement: &19222540 !ruby/object:Gem::Requirement
|
56
45
|
none: false
|
57
46
|
requirements:
|
58
47
|
- - ! '>='
|
@@ -60,84 +49,64 @@ dependencies:
|
|
60
49
|
version: '0'
|
61
50
|
type: :development
|
62
51
|
prerelease: false
|
63
|
-
version_requirements: *
|
64
|
-
description: ! 'The Hashery is a collection of Hash-like classes
|
65
|
-
|
52
|
+
version_requirements: *19222540
|
53
|
+
description: ! 'The Hashery is a tight collection of Hash-like classes. Included among
|
54
|
+
its many
|
55
|
+
|
56
|
+
offerings are the auto-sorting Dictionary class, the efficient LRUHash, the
|
66
57
|
|
67
|
-
|
58
|
+
flexible OpenHash and the convenient KeyHash. Nearly every class is a subclass
|
68
59
|
|
69
|
-
|
60
|
+
of the CRUDHash which defines a CRUD model on top of Ruby''s standard Hash
|
70
61
|
|
71
|
-
|
62
|
+
making it a snap to subclass and augment to fit any specific use case.'
|
72
63
|
email:
|
73
64
|
- transfire@gmail.com
|
74
65
|
executables: []
|
75
66
|
extensions: []
|
76
67
|
extra_rdoc_files:
|
68
|
+
- LICENSE.txt
|
69
|
+
- NOTICE.txt
|
77
70
|
- HISTORY.rdoc
|
71
|
+
- DEMO.rdoc
|
78
72
|
- README.rdoc
|
79
|
-
- QED.rdoc
|
80
|
-
- COPYING.rdoc
|
81
73
|
files:
|
82
74
|
- .ruby
|
83
75
|
- .yardopts
|
84
76
|
- lib/hashery/association.rb
|
85
|
-
- lib/hashery/basic_object.rb
|
86
|
-
- lib/hashery/basic_struct.rb
|
87
|
-
- lib/hashery/basicobject.rb
|
88
|
-
- lib/hashery/basicstruct.rb
|
89
77
|
- lib/hashery/casting_hash.rb
|
90
|
-
- lib/hashery/castinghash.rb
|
91
78
|
- lib/hashery/core_ext.rb
|
79
|
+
- lib/hashery/crud_hash.rb
|
92
80
|
- lib/hashery/dictionary.rb
|
93
81
|
- lib/hashery/fuzzy_hash.rb
|
94
|
-
- lib/hashery/
|
95
|
-
- lib/hashery/ini.rb
|
82
|
+
- lib/hashery/ini_hash.rb
|
96
83
|
- lib/hashery/key_hash.rb
|
97
|
-
- lib/hashery/keyhash.rb
|
98
84
|
- lib/hashery/linked_list.rb
|
99
|
-
- lib/hashery/linkedlist.rb
|
100
85
|
- lib/hashery/lru_hash.rb
|
101
|
-
- lib/hashery/lruhash.rb
|
102
|
-
- lib/hashery/memoizer.rb
|
103
86
|
- lib/hashery/open_cascade.rb
|
104
87
|
- lib/hashery/open_hash.rb
|
105
|
-
- lib/hashery/open_object.rb
|
106
|
-
- lib/hashery/opencascade.rb
|
107
|
-
- lib/hashery/openhash.rb
|
108
|
-
- lib/hashery/openobject.rb
|
109
88
|
- lib/hashery/ordered_hash.rb
|
110
|
-
- lib/hashery/
|
111
|
-
- lib/hashery/ostructable.rb
|
89
|
+
- lib/hashery/path_hash.rb
|
112
90
|
- lib/hashery/property_hash.rb
|
113
|
-
- lib/hashery/propertyhash.rb
|
114
91
|
- lib/hashery/query_hash.rb
|
115
|
-
- lib/hashery/queryhash.rb
|
116
92
|
- lib/hashery/stash.rb
|
117
93
|
- lib/hashery/static_hash.rb
|
118
|
-
- lib/hashery/statichash.rb
|
119
94
|
- lib/hashery.rb
|
120
95
|
- lib/hashery.yml
|
121
|
-
- qed/01_openhash.rdoc
|
122
|
-
- qed/02_queryhash.rdoc
|
123
|
-
- qed/03_castinghash.rdoc
|
124
|
-
- qed/04_statichash.rdoc
|
125
|
-
- qed/05_association.rdoc
|
126
|
-
- qed/06_opencascade.rdoc
|
127
|
-
- qed/07_fuzzyhash.rdoc
|
128
|
-
- qed/08_properyhash.rdoc
|
129
|
-
- qed/09_ostructable.rdoc
|
130
|
-
- qed/applique/ae.rb
|
131
96
|
- test/case_association.rb
|
132
|
-
- test/case_basicstruct.rb
|
133
97
|
- test/case_dictionary.rb
|
134
|
-
- test/
|
135
|
-
- test/
|
136
|
-
- test/
|
98
|
+
- test/case_key_hash.rb
|
99
|
+
- test/case_lru_hash.rb
|
100
|
+
- test/case_open_cascade.rb
|
101
|
+
- test/case_open_hash.rb
|
102
|
+
- test/case_query_hash.rb
|
103
|
+
- test/helper.rb
|
137
104
|
- HISTORY.rdoc
|
105
|
+
- DEMO.rdoc
|
106
|
+
- LICENSE.txt
|
138
107
|
- README.rdoc
|
139
|
-
-
|
140
|
-
-
|
108
|
+
- NOTICE.txt
|
109
|
+
- Config.rb
|
141
110
|
homepage: http://rubyworks.github.com/hashery
|
142
111
|
licenses:
|
143
112
|
- BSD-2-Clause
|
@@ -145,6 +114,7 @@ post_install_message:
|
|
145
114
|
rdoc_options: []
|
146
115
|
require_paths:
|
147
116
|
- lib
|
117
|
+
- alt
|
148
118
|
required_ruby_version: !ruby/object:Gem::Requirement
|
149
119
|
none: false
|
150
120
|
requirements:
|
@@ -159,7 +129,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
159
129
|
version: '0'
|
160
130
|
requirements: []
|
161
131
|
rubyforge_project:
|
162
|
-
rubygems_version: 1.8.
|
132
|
+
rubygems_version: 1.8.11
|
163
133
|
signing_key:
|
164
134
|
specification_version: 3
|
165
135
|
summary: Facets-bread collection of Hash-like classes.
|
data/COPYING.rdoc
DELETED
@@ -1,45 +0,0 @@
|
|
1
|
-
= COPYRIGHT NOTICES
|
2
|
-
|
3
|
-
== Hashery
|
4
|
-
|
5
|
-
Copyright:: (c) 2009 Thomas Sawyer, Rubyworks
|
6
|
-
License:: BSD-2-Clause
|
7
|
-
Website:: http://rubyworks.github.com/hashery
|
8
|
-
|
9
|
-
Copyright (c) 2009 Thomas Sawyer, Rubyworks
|
10
|
-
|
11
|
-
Redistribution and use in source and binary forms, with or without modification, are
|
12
|
-
permitted provided that the following conditions are met:
|
13
|
-
|
14
|
-
1. Redistributions of source code must retain the above copyright notice, this list of
|
15
|
-
conditions and the following disclaimer.
|
16
|
-
|
17
|
-
2. Redistributions in binary form must reproduce the above copyright notice, this list
|
18
|
-
of conditions and the following disclaimer in the documentation and/or other materials
|
19
|
-
provided with the distribution.
|
20
|
-
|
21
|
-
THIS SOFTWARE IS PROVIDED BY Thomas Sawyer ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
22
|
-
WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
23
|
-
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Thomas Sawyer OR
|
24
|
-
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
25
|
-
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
26
|
-
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
27
|
-
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
28
|
-
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
29
|
-
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
30
|
-
|
31
|
-
The views and conclusions contained in the software and documentation are those of the
|
32
|
-
authors and should not be interpreted as representing official policies, either expressed
|
33
|
-
or implied, of Thomas Sawyer.
|
34
|
-
|
35
|
-
== BasicObject
|
36
|
-
|
37
|
-
Copyright:: (c) 2004 Jim Weirich
|
38
|
-
Website:: http://rake.rubyforge.org
|
39
|
-
|
40
|
-
BasicObject class is a variation of Jim Weirich's BlankSlate class.
|
41
|
-
|
42
|
-
BlankSlate
|
43
|
-
Copyright 2004 by Jim Weirich (jim@weirichhouse.org).
|
44
|
-
All rights reserved.
|
45
|
-
|
data/lib/hashery/basic_object.rb
DELETED
@@ -1,74 +0,0 @@
|
|
1
|
-
# Facets' BasicObject is an implementation of Jim Weirich's BlankSlate.
|
2
|
-
#
|
3
|
-
# BlankSlate
|
4
|
-
# Copyright 2004 by Jim Weirich (jim@weirichhouse.org).
|
5
|
-
# All rights reserved.
|
6
|
-
#
|
7
|
-
# Since Ruby 1.9 has a BasicObject class this will of course be
|
8
|
-
# deprecated as 1.9 goes mainstream.
|
9
|
-
|
10
|
-
unless defined? BasicObject # in case it already exists!
|
11
|
-
|
12
|
-
# BasicObject provides an abstract base class with no predefined
|
13
|
-
# methods (except for <tt>\_\_send__</tt> and <tt>\_\_id__</tt>).
|
14
|
-
# BlankSlate is useful as a base class when writing classes that
|
15
|
-
# depend upon <tt>method_missing</tt> (e.g. dynamic proxies).
|
16
|
-
class BasicObject
|
17
|
-
class << self
|
18
|
-
# Hide the method named +name+ in the BlankSlate class. Don't
|
19
|
-
# hide +instance_eval+ or any method beginning with "__".
|
20
|
-
#
|
21
|
-
# According to 1.9.1 it should have only these methods:
|
22
|
-
#
|
23
|
-
# * #__send__
|
24
|
-
# * #instance_eval
|
25
|
-
# * #instance_exec
|
26
|
-
# * #equal?
|
27
|
-
# * #==
|
28
|
-
# * #!
|
29
|
-
# * #!=
|
30
|
-
# * respond_to?
|
31
|
-
#
|
32
|
-
# Seems to me it should have #__id__ too.
|
33
|
-
def hide(name)
|
34
|
-
undef_method name if
|
35
|
-
instance_methods.include?(name.to_s) and
|
36
|
-
name !~ /^(__|respond_to\?|instance_eval$|instance_exec$|equal\?$|\=\=$)/
|
37
|
-
end
|
38
|
-
end
|
39
|
-
instance_methods.each{ |m| hide(m) }
|
40
|
-
end
|
41
|
-
|
42
|
-
# Since Ruby is very dynamic, methods added to the ancestors of
|
43
|
-
# BlankSlate <em>after BlankSlate is defined</em> will show up in the
|
44
|
-
# list of available BlankSlate methods. We handle this by defining a
|
45
|
-
# hook in the Object and Kernel classes that will hide any defined
|
46
|
-
module Kernel #:nodoc:
|
47
|
-
class << self
|
48
|
-
alias_method :basic_object_method_added, :method_added
|
49
|
-
|
50
|
-
# Detect method additions to Kernel and remove them in the
|
51
|
-
# BlankSlate class.
|
52
|
-
def method_added(name)
|
53
|
-
basic_object_method_added(name)
|
54
|
-
return if self != Kernel
|
55
|
-
BasicObject.hide(name)
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
class Object #:nodoc:
|
61
|
-
class << self
|
62
|
-
alias_method :basic_object_method_added, :method_added
|
63
|
-
|
64
|
-
# Detect method additions to Object and remove them in the
|
65
|
-
# BlankSlate class.
|
66
|
-
def method_added(name)
|
67
|
-
basic_object_method_added(name)
|
68
|
-
return if self != Object
|
69
|
-
BasicObject.hide(name)
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
end
|
data/lib/hashery/basic_struct.rb
DELETED
@@ -1,288 +0,0 @@
|
|
1
|
-
unless defined?(BasicObject)
|
2
|
-
require 'blankslate'
|
3
|
-
BasicObject = BlankSlate
|
4
|
-
end
|
5
|
-
|
6
|
-
# = BasicStruct
|
7
|
-
#
|
8
|
-
# BasicStruct is very similar to Ruby's own OpenStruct, but it offers some
|
9
|
-
# advantages. With OpenStruct, slots with the same name as predefined
|
10
|
-
# Object methods cannot be used. With BasicStruct, almost any slot can be
|
11
|
-
# defined. BasicStruct is a subclass of BasicObject to ensure all method
|
12
|
-
# slots, except those that are absolutely essential, are open for use.
|
13
|
-
#
|
14
|
-
#--
|
15
|
-
# If you wish to pass a BasicStruct to a routine that normal takes a Hash,
|
16
|
-
# but are uncertain it can handle the distictions properly you can convert
|
17
|
-
# easily to a Hash using #as_hash! and the result will automatically be
|
18
|
-
# converted back to an BasicStruct on return.
|
19
|
-
#
|
20
|
-
# o = BasicStruct.new(:a=>1,:b=>2)
|
21
|
-
# o.as_hash!{ |h| h.update(:a=>6) }
|
22
|
-
# o #=> #<BasicObject {:a=>6,:b=>2}>
|
23
|
-
#++
|
24
|
-
#
|
25
|
-
# Unlike a Hash, all BasicStruct's keys are symbols and all keys are converted
|
26
|
-
# to such using #to_sym on the fly.
|
27
|
-
|
28
|
-
class BasicStruct < BasicObject
|
29
|
-
|
30
|
-
#PUBLIC_METHODS = /(^__|^instance_|^object_|^\W|^as$|^send$|^class$|\?$)/
|
31
|
-
#protected(*public_instance_methods.select{ |m| m !~ PUBLIC_METHODS })
|
32
|
-
|
33
|
-
def self.[](hash=nil)
|
34
|
-
new(hash)
|
35
|
-
end
|
36
|
-
|
37
|
-
# Inititalizer for BasicObject is slightly different than that of Hash.
|
38
|
-
# It does not take a default parameter, but an initial priming Hash,
|
39
|
-
# like OpenStruct. The initializer can still take a default block
|
40
|
-
# however. To set the default value use <code>#default!(value)</code>.
|
41
|
-
#
|
42
|
-
# BasicObject.new(:a=>1).default!(0)
|
43
|
-
#
|
44
|
-
def initialize(hash=nil, &yld)
|
45
|
-
@table = ::Hash.new(&yld)
|
46
|
-
if hash
|
47
|
-
hash.each{ |k,v| store(k,v) }
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
#
|
52
|
-
def initialize_copy(orig)
|
53
|
-
orig.each{ |k,v| store(k,v) }
|
54
|
-
end
|
55
|
-
|
56
|
-
# Object inspection.
|
57
|
-
# TODO: Need to get __class__ and __id__ in hex form.
|
58
|
-
def inspect
|
59
|
-
#@table.inspect
|
60
|
-
hexid = __id__
|
61
|
-
klass = "BasicObject" # __class__
|
62
|
-
"#<#{klass}:#{hexid} #{@table.inspect}>"
|
63
|
-
end
|
64
|
-
|
65
|
-
# Convert to an associative array.
|
66
|
-
def to_a
|
67
|
-
@table.to_a
|
68
|
-
end
|
69
|
-
|
70
|
-
#
|
71
|
-
def to_h
|
72
|
-
@table.dup
|
73
|
-
end
|
74
|
-
|
75
|
-
#
|
76
|
-
def to_hash
|
77
|
-
@table.dup
|
78
|
-
end
|
79
|
-
|
80
|
-
#
|
81
|
-
def to_basicstruct
|
82
|
-
self
|
83
|
-
end
|
84
|
-
|
85
|
-
# Convert to an assignment procedure.
|
86
|
-
def to_proc(response=false)
|
87
|
-
hash = @table
|
88
|
-
if response
|
89
|
-
::Proc.new do |o|
|
90
|
-
hash.each do |k,v|
|
91
|
-
o.__send__("#{k}=", v) rescue nil
|
92
|
-
end
|
93
|
-
end
|
94
|
-
else
|
95
|
-
::Proc.new do |o|
|
96
|
-
hash.each{ |k,v| o.__send__("#{k}=", v) }
|
97
|
-
end
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
101
|
-
# NOT SURE ABOUT THIS
|
102
|
-
def as_hash
|
103
|
-
@table
|
104
|
-
end
|
105
|
-
|
106
|
-
# Is a given +key+ defined?
|
107
|
-
def key?(key)
|
108
|
-
@table.key?(key.to_sym)
|
109
|
-
end
|
110
|
-
|
111
|
-
#
|
112
|
-
def is_a?(klass)
|
113
|
-
return true if klass == ::Hash # TODO: Is this wise? How to fake a subclass?
|
114
|
-
return true if klass == ::BasicObject
|
115
|
-
false
|
116
|
-
end
|
117
|
-
|
118
|
-
# Iterate over each key-value pair.
|
119
|
-
def each(&yld)
|
120
|
-
@table.each(&yld)
|
121
|
-
end
|
122
|
-
|
123
|
-
# Set the default value.
|
124
|
-
def default!(default)
|
125
|
-
@table.default = default
|
126
|
-
end
|
127
|
-
|
128
|
-
# Check equality.
|
129
|
-
def ==( other )
|
130
|
-
case other
|
131
|
-
when ::BasicStruct
|
132
|
-
@table == other.as_hash
|
133
|
-
when ::Hash
|
134
|
-
@table == other
|
135
|
-
else
|
136
|
-
if other.respond_to?(:to_hash)
|
137
|
-
@table == other.to_hash
|
138
|
-
else
|
139
|
-
false
|
140
|
-
end
|
141
|
-
end
|
142
|
-
end
|
143
|
-
|
144
|
-
#
|
145
|
-
def eql?( other )
|
146
|
-
case other
|
147
|
-
when ::BasicStruct
|
148
|
-
@table.eql?(other.as_hash)
|
149
|
-
else
|
150
|
-
false
|
151
|
-
end
|
152
|
-
end
|
153
|
-
|
154
|
-
#
|
155
|
-
def <<(x)
|
156
|
-
case x
|
157
|
-
when ::Hash
|
158
|
-
@table.update(x)
|
159
|
-
when ::Array
|
160
|
-
x.each_slice(2) do |(k,v)|
|
161
|
-
@table[k] = v
|
162
|
-
end
|
163
|
-
end
|
164
|
-
end
|
165
|
-
|
166
|
-
#
|
167
|
-
def []=(key, value)
|
168
|
-
@table[key.to_sym] = value
|
169
|
-
end
|
170
|
-
|
171
|
-
#
|
172
|
-
def [](key)
|
173
|
-
@table[key.to_sym]
|
174
|
-
end
|
175
|
-
|
176
|
-
#
|
177
|
-
def merge!(other)
|
178
|
-
BasicObject.new(@table.merge!(other))
|
179
|
-
end
|
180
|
-
|
181
|
-
#
|
182
|
-
def update!(other)
|
183
|
-
@table.update(other)
|
184
|
-
self
|
185
|
-
end
|
186
|
-
|
187
|
-
#
|
188
|
-
def respond_to?(key)
|
189
|
-
key?(key)
|
190
|
-
end
|
191
|
-
|
192
|
-
# NOTE: These were protected, why?
|
193
|
-
|
194
|
-
#
|
195
|
-
def store(k, v)
|
196
|
-
@table.store(k.to_sym, v)
|
197
|
-
end
|
198
|
-
|
199
|
-
#
|
200
|
-
def fetch(k, *d, &b)
|
201
|
-
@table.fetch(k.to_sym, *d, &b)
|
202
|
-
end
|
203
|
-
|
204
|
-
protected
|
205
|
-
|
206
|
-
#def as_hash!
|
207
|
-
# Functor.new do |op,*a,&b|
|
208
|
-
# result = @table.__send__(op,*a,&b)
|
209
|
-
# case result
|
210
|
-
# when Hash
|
211
|
-
# BasicObject.new(result)
|
212
|
-
# else
|
213
|
-
# result
|
214
|
-
# end
|
215
|
-
# end
|
216
|
-
#end
|
217
|
-
|
218
|
-
#def define_slot(key, value=nil)
|
219
|
-
# @table[key.to_sym] = value
|
220
|
-
#end
|
221
|
-
|
222
|
-
#def protect_slot( key )
|
223
|
-
# (class << self; self; end).class_eval {
|
224
|
-
# protected key rescue nil
|
225
|
-
# }
|
226
|
-
#end
|
227
|
-
|
228
|
-
def method_missing(sym, *args, &blk)
|
229
|
-
type = sym.to_s[-1,1]
|
230
|
-
key = sym.to_s.sub(/[=?!]$/,'').to_sym
|
231
|
-
case type
|
232
|
-
when '='
|
233
|
-
store(key, args[0])
|
234
|
-
when '!'
|
235
|
-
@table.__send__(key, *args, &blk)
|
236
|
-
# if key?(key)
|
237
|
-
# fetch(key)
|
238
|
-
# else
|
239
|
-
# store(key, BasicObject.new)
|
240
|
-
# end
|
241
|
-
when '?'
|
242
|
-
fetch(key)
|
243
|
-
else
|
244
|
-
fetch(key)
|
245
|
-
end
|
246
|
-
end
|
247
|
-
|
248
|
-
end
|
249
|
-
|
250
|
-
# Core Extensions
|
251
|
-
|
252
|
-
class Hash
|
253
|
-
# Convert a Hash into a BasicStruct.
|
254
|
-
def to_basicstruct
|
255
|
-
BasicStruct[self]
|
256
|
-
end
|
257
|
-
end
|
258
|
-
|
259
|
-
=begin
|
260
|
-
class NilClass
|
261
|
-
# Nil converts to an empty BasicObject.
|
262
|
-
def to_basicstruct
|
263
|
-
BasicObject.new
|
264
|
-
end
|
265
|
-
end
|
266
|
-
|
267
|
-
class Proc
|
268
|
-
# Translates a Proc into an BasicObject. By droping an BasicObject into
|
269
|
-
# the Proc, the resulting assignments incured as the procedure is
|
270
|
-
# evaluated produce the BasicObject. This technique is simlar to that
|
271
|
-
# of MethodProbe.
|
272
|
-
#
|
273
|
-
# p = lambda { |x|
|
274
|
-
# x.word = "Hello"
|
275
|
-
# }
|
276
|
-
# o = p.to_basicstruct
|
277
|
-
# o.word #=> "Hello"
|
278
|
-
#
|
279
|
-
# NOTE The Proc must have an arity of one --no more and no less.
|
280
|
-
def to_basicstruct
|
281
|
-
raise ArgumentError, 'bad arity for converting Proc to basicstruct' if arity != 1
|
282
|
-
o = BasicObject.new
|
283
|
-
self.call( o )
|
284
|
-
o
|
285
|
-
end
|
286
|
-
end
|
287
|
-
=end
|
288
|
-
|