hashery 1.3.0 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
data/.ruby ADDED
@@ -0,0 +1,98 @@
1
+ ---
2
+ name: hashery
3
+ company: RubyWorks
4
+ title: Hashery
5
+ contact: Trans <transfire@gmail.com>
6
+ maintainers:
7
+ - Trans <transfire@gmail.com>
8
+ pom_verison: 1.0.0
9
+ requires:
10
+ - group:
11
+ - build
12
+ name: syckle
13
+ version: 0+
14
+ - group:
15
+ - test
16
+ name: qed
17
+ version: 0+
18
+ resources:
19
+ repo: git://github.com/rubyworks/hashery.git
20
+ code: http://github.com/rubyworks/hashery
21
+ api: http://rubyworks.github.com/hashery/docs/api
22
+ mail: http://groups.google.com/group/rubyworks-mailinglist
23
+ host: http://rubygems.org/gems/hashery
24
+ wiki: http://wiki.github.com/rubyworks/hashery
25
+ home: http://rubyworks.github.com/hashery
26
+ manifest:
27
+ - .ruby
28
+ - lib/hashery/association.rb
29
+ - lib/hashery/basic_struct.rb
30
+ - lib/hashery/basicobject.rb
31
+ - lib/hashery/basicstruct.rb
32
+ - lib/hashery/casting_hash.rb
33
+ - lib/hashery/castinghash.rb
34
+ - lib/hashery/dictionary.rb
35
+ - lib/hashery/fuzzy_hash.rb
36
+ - lib/hashery/fuzzyhash.rb
37
+ - lib/hashery/ini.rb
38
+ - lib/hashery/linked_list.rb
39
+ - lib/hashery/linkedlist.rb
40
+ - lib/hashery/lru_hash.rb
41
+ - lib/hashery/lruhash.rb
42
+ - lib/hashery/memoizer.rb
43
+ - lib/hashery/open_cascade.rb
44
+ - lib/hashery/open_hash.rb
45
+ - lib/hashery/open_object.rb
46
+ - lib/hashery/opencascade.rb
47
+ - lib/hashery/openhash.rb
48
+ - lib/hashery/openobject.rb
49
+ - lib/hashery/ordered_hash.rb
50
+ - lib/hashery/orderedhash.rb
51
+ - lib/hashery/ostructable.rb
52
+ - lib/hashery/property_hash.rb
53
+ - lib/hashery/propertyhash.rb
54
+ - lib/hashery/query_hash.rb
55
+ - lib/hashery/queryhash.rb
56
+ - lib/hashery/sparse_array.rb
57
+ - lib/hashery/sparsearray.rb
58
+ - lib/hashery/stash.rb
59
+ - lib/hashery/static_hash.rb
60
+ - lib/hashery/statichash.rb
61
+ - lib/hashery.rb
62
+ - lib/hashery.yml
63
+ - qed/01_openhash.rdoc
64
+ - qed/02_queryhash.rdoc
65
+ - qed/03_castinghash.rdoc
66
+ - qed/04_statichash.rdoc
67
+ - qed/05_association.rdoc
68
+ - qed/06_opencascade.rdoc
69
+ - qed/07_fuzzyhash.rdoc
70
+ - qed/08_properyhash.rdoc
71
+ - qed/09_ostructable.rdoc
72
+ - qed/applique/ae.rb
73
+ - test/case_association.rb
74
+ - test/case_dictionary.rb
75
+ - test/case_opencascade.rb
76
+ - test/case_openhash.rb
77
+ - test/case_openobject.rb
78
+ - test/case_sparsearray.rb
79
+ - test/case_stash.rb
80
+ - HISTORY.rdoc
81
+ - LICENSE
82
+ - README.rdoc
83
+ - NOTICE
84
+ version: 1.4.0
85
+ licenses:
86
+ - Apache 2.0
87
+ copyright: Copyright (c) 2010 Thomas Sawyer
88
+ description: The Hashery is a collection of Hash-like classes, spun-off from the original Ruby Facets library. Included are the widely used OrderedHash, the related but more featured Dictionary class, a number of open classes, similiar to the standard OpenStruct and a few variations on the standard Hash.
89
+ summary: Facets-bread collection of Hash-like classes.
90
+ authors:
91
+ - Thomas Sawyer
92
+ - Kirk Haines
93
+ - Robert Klemme
94
+ - Jan Molic
95
+ - George Moschovitis
96
+ - Jeena Paradies
97
+ - Erik Veenstra
98
+ created: 2010-04-21
@@ -1,6 +1,19 @@
1
1
  = RELEASE HISTORY
2
2
 
3
- == 1.3.0 // 2010-10-01
3
+ == 1.4.0 / 2011-01-19
4
+
5
+ This release includes a copy of Ruby Facets' BasicObject class, which
6
+ fixes the loading bug of the previous version. This release also renames
7
+ OpenObject to BasicStruct, which is a much better destription of what the
8
+ class actually provides.
9
+
10
+ Changes:
11
+
12
+ * Rename OpenObject to BasicStruct.
13
+ * Fix basicobject.rb loading issue.
14
+
15
+
16
+ == 1.3.0 / 2010-10-01
4
17
 
5
18
  This release fixes a minor bug in CastingHash and adds a new
6
19
  PropertyHash class.
@@ -16,7 +29,7 @@ Changes:
16
29
  * Fixed CastingHash#new where #to_proc is called against NilClass
17
30
 
18
31
 
19
- == 1.2.0 // 2010-06-04
32
+ == 1.2.0 / 2010-06-04
20
33
 
21
34
  This release makes two signifficant changes to the Hashery.
22
35
  First, we have a new shiny library called FuzzyHash by
@@ -37,7 +50,7 @@ Changes:
37
50
  * OpenCascade subclasses OpenHash and handles Array cascading.
38
51
 
39
52
 
40
- == 1.1.0 // 2010-04-28
53
+ == 1.1.0 / 2010-04-28
41
54
 
42
55
  A follow-up release of Hashery that adds two new libraries:
43
56
  Association and SparseArray. Both of these may seem like odd
@@ -56,7 +69,7 @@ Changes:
56
69
  * Added sparsearray.rb
57
70
 
58
71
 
59
- == 1.0.0 // 2010-04-21
72
+ == 1.0.0 / 2010-04-21
60
73
 
61
74
  This is the first release of the Facets Hashery.
62
75
  Most of included classes come directly from Ruby
data/NOTICE ADDED
@@ -0,0 +1,11 @@
1
+ = COPYRIGHT NOTICES
2
+
3
+ == BasicObject
4
+
5
+ BasicObject class is a variation of Jim Weirich's BlankSlate class.
6
+
7
+ BlankSlate
8
+ Copyright 2004 by Jim Weirich (jim@weirichhouse.org).
9
+ All rights reserved.
10
+
11
+
@@ -1,10 +1,10 @@
1
+ require 'hashery/basicstruct'
1
2
  require 'hashery/castinghash'
2
3
  require 'hashery/dictionary'
3
4
  require 'hashery/lruhash'
4
5
  require 'hashery/memoizer'
5
6
  require 'hashery/opencascade'
6
7
  require 'hashery/openhash'
7
- require 'hashery/openobject'
8
8
  require 'hashery/orderedhash'
9
9
  require 'hashery/ostructable'
10
10
  require 'hashery/queryhash'
@@ -0,0 +1,98 @@
1
+ ---
2
+ name: hashery
3
+ company: RubyWorks
4
+ title: Hashery
5
+ contact: Trans <transfire@gmail.com>
6
+ maintainers:
7
+ - Trans <transfire@gmail.com>
8
+ pom_verison: 1.0.0
9
+ requires:
10
+ - group:
11
+ - build
12
+ name: syckle
13
+ version: 0+
14
+ - group:
15
+ - test
16
+ name: qed
17
+ version: 0+
18
+ resources:
19
+ repo: git://github.com/rubyworks/hashery.git
20
+ code: http://github.com/rubyworks/hashery
21
+ api: http://rubyworks.github.com/hashery/docs/api
22
+ mail: http://groups.google.com/group/rubyworks-mailinglist
23
+ host: http://rubygems.org/gems/hashery
24
+ wiki: http://wiki.github.com/rubyworks/hashery
25
+ home: http://rubyworks.github.com/hashery
26
+ manifest:
27
+ - .ruby
28
+ - lib/hashery/association.rb
29
+ - lib/hashery/basic_struct.rb
30
+ - lib/hashery/basicobject.rb
31
+ - lib/hashery/basicstruct.rb
32
+ - lib/hashery/casting_hash.rb
33
+ - lib/hashery/castinghash.rb
34
+ - lib/hashery/dictionary.rb
35
+ - lib/hashery/fuzzy_hash.rb
36
+ - lib/hashery/fuzzyhash.rb
37
+ - lib/hashery/ini.rb
38
+ - lib/hashery/linked_list.rb
39
+ - lib/hashery/linkedlist.rb
40
+ - lib/hashery/lru_hash.rb
41
+ - lib/hashery/lruhash.rb
42
+ - lib/hashery/memoizer.rb
43
+ - lib/hashery/open_cascade.rb
44
+ - lib/hashery/open_hash.rb
45
+ - lib/hashery/open_object.rb
46
+ - lib/hashery/opencascade.rb
47
+ - lib/hashery/openhash.rb
48
+ - lib/hashery/openobject.rb
49
+ - lib/hashery/ordered_hash.rb
50
+ - lib/hashery/orderedhash.rb
51
+ - lib/hashery/ostructable.rb
52
+ - lib/hashery/property_hash.rb
53
+ - lib/hashery/propertyhash.rb
54
+ - lib/hashery/query_hash.rb
55
+ - lib/hashery/queryhash.rb
56
+ - lib/hashery/sparse_array.rb
57
+ - lib/hashery/sparsearray.rb
58
+ - lib/hashery/stash.rb
59
+ - lib/hashery/static_hash.rb
60
+ - lib/hashery/statichash.rb
61
+ - lib/hashery.rb
62
+ - lib/hashery.yml
63
+ - qed/01_openhash.rdoc
64
+ - qed/02_queryhash.rdoc
65
+ - qed/03_castinghash.rdoc
66
+ - qed/04_statichash.rdoc
67
+ - qed/05_association.rdoc
68
+ - qed/06_opencascade.rdoc
69
+ - qed/07_fuzzyhash.rdoc
70
+ - qed/08_properyhash.rdoc
71
+ - qed/09_ostructable.rdoc
72
+ - qed/applique/ae.rb
73
+ - test/case_association.rb
74
+ - test/case_dictionary.rb
75
+ - test/case_opencascade.rb
76
+ - test/case_openhash.rb
77
+ - test/case_openobject.rb
78
+ - test/case_sparsearray.rb
79
+ - test/case_stash.rb
80
+ - HISTORY.rdoc
81
+ - LICENSE
82
+ - README.rdoc
83
+ - NOTICE
84
+ version: 1.4.0
85
+ licenses:
86
+ - Apache 2.0
87
+ copyright: Copyright (c) 2010 Thomas Sawyer
88
+ description: The Hashery is a collection of Hash-like classes, spun-off from the original Ruby Facets library. Included are the widely used OrderedHash, the related but more featured Dictionary class, a number of open classes, similiar to the standard OpenStruct and a few variations on the standard Hash.
89
+ summary: Facets-bread collection of Hash-like classes.
90
+ authors:
91
+ - Thomas Sawyer
92
+ - Kirk Haines
93
+ - Robert Klemme
94
+ - Jan Molic
95
+ - George Moschovitis
96
+ - Jeena Paradies
97
+ - Erik Veenstra
98
+ created: 2010-04-21
@@ -0,0 +1 @@
1
+ require 'hashery/superstruct'
@@ -0,0 +1,74 @@
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
@@ -0,0 +1,280 @@
1
+ require 'hashery/basicobject'
2
+
3
+ #require 'facets/hash/to_h'
4
+ #require 'facets/kernel/object_class'
5
+ #require 'facets/kernel/object_hexid'
6
+
7
+ # = BasicStruct
8
+ #
9
+ # BasicObject is very similar to Ruby's own OpenStruct, but it offers some
10
+ # advantages. With OpenStruct, slots with the same name as predefined
11
+ # Object methods cannot be used. With BasicObject, almost any slot can be
12
+ # defined. BasicObject is a subclass of BasicObject to ensure all method
13
+ # slots, except those that are absolutely essential, are open for use.
14
+ #
15
+ #--
16
+ # If you wish to pass an BasicObject to a routine that normal takes a Hash,
17
+ # but are uncertain it can handle the distictions properly you can convert
18
+ # easily to a Hash using #as_hash! and the result will automatically be
19
+ # converted back to an BasicObject on return.
20
+ #
21
+ # o = BasicObject.new(:a=>1,:b=>2)
22
+ # o.as_hash!{ |h| h.update(:a=>6) }
23
+ # o #=> #<BasicObject {:a=>6,:b=>2}>
24
+ #++
25
+ #
26
+ # Unlike a Hash, all BasicObject's keys are symbols and all keys are converted
27
+ # to such using #to_sym on the fly.
28
+
29
+ class BasicStruct < BasicObject
30
+
31
+ #PUBLIC_METHODS = /(^__|^instance_|^object_|^\W|^as$|^send$|^class$|\?$)/
32
+ #protected(*public_instance_methods.select{ |m| m !~ PUBLIC_METHODS })
33
+
34
+ def self.[](hash=nil)
35
+ new(hash)
36
+ end
37
+
38
+ # Inititalizer for BasicObject is slightly different than that of Hash.
39
+ # It does not take a default parameter, but an initial priming Hash,
40
+ # like OpenStruct. The initializer can still take a default block
41
+ # however. To set the default value use <code>#default!(value)</code>.
42
+ #
43
+ # BasicObject.new(:a=>1).default!(0)
44
+ #
45
+ def initialize(hash=nil, &yld)
46
+ @table = Hash.new(&yld)
47
+ if hash
48
+ hash.each{ |k,v| store(k,v) }
49
+ end
50
+ end
51
+
52
+ #
53
+ def initialize_copy(orig)
54
+ orig.each{ |k,v| store(k,v) }
55
+ end
56
+
57
+ # Object inspection.
58
+ # TODO: Need to get __class__ and __id__ in hex form.
59
+ def inspect
60
+ #@table.inspect
61
+ hexid = __id__
62
+ klass = "BasicObject" # __class__
63
+ "#<#{klass}:#{hexid} #{@table.inspect}>"
64
+ end
65
+
66
+ # Convert to an associative array.
67
+ def to_a
68
+ @table.to_a
69
+ end
70
+
71
+ #
72
+ def to_h
73
+ @table.dup
74
+ end
75
+
76
+ #
77
+ def to_hash
78
+ @table.dup
79
+ end
80
+
81
+ #
82
+ def to_basicstruct
83
+ self
84
+ end
85
+
86
+ # Convert to an assignment procedure.
87
+ def to_proc(response=false)
88
+ hash = @table
89
+ if response
90
+ lambda do |o|
91
+ hash.each do |k,v|
92
+ o.__send__("#{k}=", v) rescue nil
93
+ end
94
+ end
95
+ else
96
+ lambda do |o|
97
+ hash.each{ |k,v| o.__send__("#{k}=", v) }
98
+ end
99
+ end
100
+ end
101
+
102
+ # NOT SURE ABOUT THIS
103
+ def as_hash
104
+ @table
105
+ end
106
+
107
+ # Is a given +key+ defined?
108
+ def key?(key)
109
+ @table.key?(key.to_sym)
110
+ end
111
+
112
+ #
113
+ def is_a?(klass)
114
+ return true if klass == Hash # TODO: Is this wise? How to fake a subclass?
115
+ return true if klass == BasicObject
116
+ false
117
+ end
118
+
119
+ # Iterate over each key-value pair.
120
+ def each(&yld)
121
+ @table.each(&yld)
122
+ end
123
+
124
+ # Set the default value.
125
+ def default!(default)
126
+ @table.default = default
127
+ end
128
+
129
+ # Check equality.
130
+ def ==( other )
131
+ case other
132
+ when BasicObject
133
+ @table == other.as_hash
134
+ when Hash
135
+ @table == other
136
+ else
137
+ if other.respond_to?(:to_hash)
138
+ @table == other.to_hash
139
+ else
140
+ false
141
+ end
142
+ end
143
+ end
144
+
145
+ #
146
+ def eql?( other )
147
+ case other
148
+ when BasicObject
149
+ @table.eql?(other.as_hash)
150
+ else
151
+ false
152
+ end
153
+ end
154
+
155
+ #
156
+ def <<(x)
157
+ case x
158
+ when Hash
159
+ @table.update(x)
160
+ when Array
161
+ x.each_slice(2) do |(k,v)|
162
+ @table[k] = v
163
+ end
164
+ end
165
+ end
166
+
167
+ #
168
+ def []=(key, value)
169
+ @table[key.to_sym] = value
170
+ end
171
+
172
+ #
173
+ def [](key)
174
+ @table[key.to_sym]
175
+ end
176
+
177
+ #
178
+ def merge!(other)
179
+ BasicObject.new(@table.merge!(other))
180
+ end
181
+
182
+ #
183
+ def update!(other)
184
+ @table.update(other)
185
+ self
186
+ end
187
+
188
+ protected
189
+
190
+ def store(k, v)
191
+ @table.store(k.to_sym, v)
192
+ end
193
+
194
+ def fetch(k, *d, &b)
195
+ @table.fetch(k.to_sym, *d, &b)
196
+ end
197
+
198
+ #def as_hash!
199
+ # Functor.new do |op,*a,&b|
200
+ # result = @table.__send__(op,*a,&b)
201
+ # case result
202
+ # when Hash
203
+ # BasicObject.new(result)
204
+ # else
205
+ # result
206
+ # end
207
+ # end
208
+ #end
209
+
210
+ #def define_slot(key, value=nil)
211
+ # @table[key.to_sym] = value
212
+ #end
213
+
214
+ #def protect_slot( key )
215
+ # (class << self; self; end).class_eval {
216
+ # protected key rescue nil
217
+ # }
218
+ #end
219
+
220
+ def method_missing(sym, *args, &blk)
221
+ type = sym.to_s[-1,1]
222
+ key = sym.to_s.sub(/[=?!]$/,'').to_sym
223
+ case type
224
+ when '='
225
+ store(key, args[0])
226
+ when '!'
227
+ @table.__send__(key, *args, &blk)
228
+ # if key?(key)
229
+ # fetch(key)
230
+ # else
231
+ # store(key, BasicObject.new)
232
+ # end
233
+ when '?'
234
+ fetch(key)
235
+ else
236
+ fetch(key)
237
+ end
238
+ end
239
+
240
+ end
241
+
242
+ # Core Extensions
243
+
244
+ class Hash
245
+ # Convert a Hash into a BasicStruct.
246
+ def to_basicstruct
247
+ BasicStruct[self]
248
+ end
249
+ end
250
+
251
+ =begin
252
+ class NilClass
253
+ # Nil converts to an empty BasicObject.
254
+ def to_basicstruct
255
+ BasicObject.new
256
+ end
257
+ end
258
+
259
+ class Proc
260
+ # Translates a Proc into an BasicObject. By droping an BasicObject into
261
+ # the Proc, the resulting assignments incured as the procedure is
262
+ # evaluated produce the BasicObject. This technique is simlar to that
263
+ # of MethodProbe.
264
+ #
265
+ # p = lambda { |x|
266
+ # x.word = "Hello"
267
+ # }
268
+ # o = p.to_basicstruct
269
+ # o.word #=> "Hello"
270
+ #
271
+ # NOTE The Proc must have an arity of one --no more and no less.
272
+ def to_basicstruct
273
+ raise ArgumentError, 'bad arity for converting Proc to basicstruct' if arity != 1
274
+ o = BasicObject.new
275
+ self.call( o )
276
+ o
277
+ end
278
+ end
279
+ =end
280
+