facets 2.1.3 → 2.2.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/AUTHORS +14 -12
- data/CHANGES +45 -2
- data/NOTES +9 -7
- data/lib/core/facets/1stclassmethod.rb +15 -11
- data/lib/core/facets/array.rb +0 -1
- data/lib/core/facets/array/conjoin.rb +40 -8
- data/lib/core/facets/array/delete.rb +8 -2
- data/lib/core/facets/array/indexable.rb +30 -3
- data/lib/core/facets/array/merge.rb +11 -0
- data/lib/core/facets/array/only.rb +3 -3
- data/lib/core/facets/array/pad.rb +4 -46
- data/lib/core/facets/array/rotate.rb +4 -4
- data/lib/core/facets/array/select.rb +2 -0
- data/lib/core/facets/array/splice.rb +16 -2
- data/lib/core/facets/array/stackable.rb +6 -40
- data/lib/core/facets/binding.rb +3 -0
- data/lib/core/facets/binding/cflow.rb +10 -64
- data/lib/core/facets/binding/defined.rb +10 -0
- data/lib/core/facets/binding/eval.rb +10 -76
- data/lib/core/facets/binding/here.rb +9 -0
- data/lib/core/facets/binding/self.rb +10 -0
- data/lib/core/facets/binding/vars.rb +0 -45
- data/lib/core/facets/boolean.rb +31 -103
- data/lib/core/facets/class/descendents.rb +17 -44
- data/lib/core/facets/comparable/bound.rb +8 -70
- data/lib/core/facets/comparable/cmp.rb +12 -92
- data/lib/core/facets/conversion.rb +122 -321
- data/lib/core/facets/dir/multiglob.rb +0 -13
- data/lib/core/facets/dir/traverse.rb +61 -111
- data/lib/core/facets/enumerable.rb +4 -2
- data/lib/core/facets/enumerable/cartesian.rb +36 -85
- data/lib/core/facets/enumerable/collect.rb +64 -152
- data/lib/core/facets/enumerable/combination.rb +40 -42
- data/lib/core/facets/enumerable/count.rb +99 -174
- data/lib/core/facets/enumerable/each.rb +86 -0
- data/lib/core/facets/enumerable/mash.rb +58 -0
- data/lib/core/facets/enumerable/permutation.rb +39 -44
- data/lib/core/facets/enumerable/probability.rb +16 -90
- data/lib/core/facets/enumerable/split.rb +113 -0
- data/lib/core/facets/exception/detail.rb +1 -2
- data/lib/core/facets/facets.rb +3 -2
- data/lib/core/facets/file/read.rb +4 -59
- data/lib/core/facets/file/topath.rb +8 -96
- data/lib/core/facets/file/write.rb +21 -49
- data/lib/core/facets/filetest/root.rb +4 -3
- data/lib/core/facets/functor.rb +5 -43
- data/lib/core/facets/hash/at.rb +7 -37
- data/lib/core/facets/hash/delete.rb +9 -58
- data/lib/core/facets/hash/has_keys.rb +4 -43
- data/lib/core/facets/hash/insert.rb +5 -38
- data/lib/core/facets/hash/inverse.rb +2 -41
- data/lib/core/facets/hash/iterate.rb +4 -45
- data/lib/core/facets/hash/keyize.rb +24 -92
- data/lib/core/facets/hash/merge.rb +4 -38
- data/lib/core/facets/hash/new.rb +5 -38
- data/lib/core/facets/hash/op.rb +20 -66
- data/lib/core/facets/hash/rekey.rb +9 -87
- data/lib/core/facets/hash/select.rb +1 -1
- data/lib/core/facets/hash/slice.rb +42 -0
- data/lib/core/facets/hash/traverse.rb +6 -46
- data/lib/core/facets/hash/update.rb +27 -67
- data/lib/core/facets/hash/weave.rb +22 -42
- data/lib/core/facets/indexable.rb +42 -14
- data/lib/core/facets/integer/bitmask.rb +69 -106
- data/lib/core/facets/integer/factorial.rb +1 -44
- data/lib/core/facets/integer/multiples.rb +27 -22
- data/lib/core/facets/integer/of.rb +1 -33
- data/lib/core/facets/kernel.rb +4 -2
- data/lib/core/facets/kernel/ask.rb +15 -3
- data/lib/core/facets/kernel/callstack.rb +38 -69
- data/lib/core/facets/kernel/constant.rb +2 -38
- data/lib/core/facets/kernel/deepcopy.rb +3 -55
- data/lib/core/facets/kernel/dir.rb +2 -0
- data/lib/core/facets/kernel/ergo.rb +2 -2
- data/lib/core/facets/kernel/instance.rb +51 -120
- data/lib/core/facets/kernel/metaid.rb +35 -73
- data/lib/core/facets/kernel/object.rb +14 -39
- data/lib/core/facets/kernel/op_esc.rb +24 -2
- data/lib/core/facets/kernel/populate.rb +6 -69
- data/lib/core/facets/kernel/report.rb +28 -33
- data/lib/core/facets/kernel/require.rb +7 -21
- data/lib/core/facets/kernel/respond.rb +11 -1
- data/lib/core/facets/kernel/returning.rb +50 -0
- data/lib/core/facets/kernel/silence.rb +12 -24
- data/lib/core/facets/kernel/super.rb +12 -76
- data/lib/core/facets/kernel/tap.rb +25 -107
- data/lib/core/facets/kernel/val.rb +7 -46
- data/lib/core/facets/kernel/withattr.rb +6 -64
- data/lib/core/facets/matchdata/matchset.rb +8 -50
- data/lib/core/facets/module.rb +3 -1
- data/lib/core/facets/module/abstract.rb +9 -47
- data/lib/core/facets/module/alias.rb +11 -68
- data/lib/core/facets/module/attr.rb +36 -15
- data/lib/core/facets/module/cattr.rb +8 -76
- data/lib/core/facets/module/clone.rb +15 -66
- data/lib/core/facets/module/include.rb +54 -114
- data/lib/core/facets/module/methods.rb +15 -13
- data/lib/core/facets/module/modify.rb +20 -206
- data/lib/core/facets/module/name.rb +19 -83
- data/lib/core/facets/module/require.rb +48 -53
- data/lib/core/facets/module/traits.rb +74 -33
- data/lib/core/facets/nilclass/status.rb +25 -2
- data/lib/core/facets/numeric/round.rb +24 -89
- data/lib/core/facets/proc/bind.rb +16 -59
- data/lib/core/facets/proc/compose.rb +6 -40
- data/lib/core/facets/proc/fn.rb +2 -0
- data/lib/core/facets/range/combine.rb +15 -51
- data/lib/core/facets/range/overlap.rb +8 -64
- data/lib/core/facets/regexp/arity.rb +6 -41
- data/lib/core/facets/stackable.rb +43 -4
- data/lib/core/facets/string.rb +2 -0
- data/lib/core/facets/string/align.rb +45 -55
- data/lib/core/facets/string/blank.rb +2 -46
- data/lib/core/facets/string/bracket.rb +14 -87
- data/lib/core/facets/string/case.rb +45 -32
- data/lib/core/facets/string/crypt.rb +3 -40
- data/lib/core/facets/string/filter.rb +7 -49
- data/lib/core/facets/string/format.rb +24 -126
- data/lib/core/facets/string/indexable.rb +50 -133
- data/lib/core/facets/string/interpolate.rb +24 -59
- data/lib/core/facets/string/natcmp.rb +5 -39
- data/lib/core/facets/string/nchar.rb +37 -45
- data/lib/core/facets/string/op.rb +13 -0
- data/lib/core/facets/string/partitions.rb +38 -99
- data/lib/core/facets/string/range.rb +8 -49
- data/lib/core/facets/string/regesc.rb +9 -42
- data/lib/core/facets/string/scan.rb +6 -52
- data/lib/core/facets/string/splice.rb +8 -13
- data/lib/core/facets/string/tabs.rb +16 -153
- data/lib/core/facets/symbol.rb +3 -1
- data/lib/core/facets/symbol/chomp.rb +11 -29
- data/lib/core/facets/symbol/generate.rb +4 -43
- data/lib/core/facets/symbol/not.rb +13 -25
- data/lib/core/facets/symbol/shadow.rb +2 -40
- data/lib/core/facets/symbol/succ.rb +14 -13
- data/lib/core/facets/symbol/to_proc.rb +33 -28
- data/lib/core/facets/time.rb +1 -0
- data/lib/core/facets/time/change.rb +5 -38
- data/lib/core/facets/time/elapse.rb +2 -41
- data/lib/core/facets/time/stamp.rb +47 -0
- data/lib/core/facets/unboundmethod.rb +3 -0
- data/lib/core/facets/unboundmethod/arguments.rb +27 -4
- data/lib/core/facets/unboundmethod/name.rb +21 -7
- data/lib/methods/facets/enumerable/cluster_by.rb +1 -1
- data/lib/methods/facets/enumerable/collate.rb +1 -0
- data/lib/methods/facets/enumerable/divide.rb +1 -1
- data/lib/methods/facets/enumerable/each_by.rb +1 -1
- data/lib/methods/facets/enumerable/each_pair.rb +1 -1
- data/lib/methods/facets/enumerable/eachn.rb +1 -1
- data/lib/methods/facets/enumerable/graph.rb +1 -1
- data/lib/methods/facets/enumerable/group_by.rb +1 -1
- data/lib/methods/facets/enumerable/inject.rb +1 -0
- data/lib/methods/facets/enumerable/map_send.rb +1 -0
- data/lib/methods/facets/enumerable/modulate.rb +1 -0
- data/lib/methods/facets/enumerable/partition_by.rb +1 -1
- data/lib/methods/facets/hash/collate.rb +1 -1
- data/lib/methods/facets/hash/except.rb +1 -0
- data/lib/methods/facets/hash/graph.rb +1 -1
- data/lib/methods/facets/hash/mash.rb +1 -0
- data/lib/methods/facets/kernel/Bit.rb +1 -0
- data/lib/methods/facets/kernel/complete.rb +1 -1
- data/lib/methods/facets/kernel/here.rb +1 -1
- data/lib/methods/facets/kernel/non_nil.rb +1 -0
- data/lib/methods/facets/kernel/respond_with_value.rb +1 -0
- data/lib/methods/facets/kernel/with.rb +1 -1
- data/lib/methods/facets/module/class_def.rb +1 -0
- data/lib/methods/facets/string/camelcase.rb +1 -0
- data/lib/methods/facets/string/op_minus.rb +1 -0
- data/lib/methods/facets/string/snakecase.rb +1 -0
- data/lib/more/facets/attributes.rb +5 -5
- data/lib/more/facets/basicobject.rb +0 -62
- data/lib/{core/facets/continuation/create.rb → more/facets/continuation.rb} +4 -21
- data/lib/more/facets/duration.rb +534 -0
- data/lib/more/facets/lazy.rb +3 -3
- data/lib/more/facets/namespace.rb +23 -71
- data/lib/more/facets/rbsystem.rb +42 -8
- data/lib/more/facets/stylize.rb +6 -3
- data/lib/more/facets/thread.rb +55 -0
- data/meta/MANIFEST +49 -18
- data/meta/ROLLRC +1 -1
- data/meta/project.yaml +2 -2
- data/task/install +1 -1
- data/task/test/general +8 -2
- data/test/unit/array/test_pad.rb +30 -45
- data/test/unit/array/test_stackable.rb +14 -28
- data/test/unit/binding/test_cflow.rb +34 -49
- data/test/unit/binding/test_defined.rb +17 -0
- data/test/unit/binding/test_eval.rb +11 -39
- data/test/unit/binding/test_here.rb +17 -0
- data/test/unit/binding/test_self.rb +17 -0
- data/test/unit/binding/test_vars.rb +22 -37
- data/test/unit/class/test_descendents.rb +15 -30
- data/test/unit/class/test_initializer.rb +1 -8
- data/test/unit/comparable/test_bound.rb +38 -53
- data/test/unit/comparable/test_cmp.rb +45 -60
- data/test/unit/dir/test_traverse.rb +56 -0
- data/test/unit/enumerable/test_cartesian.rb +34 -47
- data/test/unit/enumerable/test_collect.rb +16 -125
- data/test/unit/enumerable/test_combination.rb +1 -8
- data/test/unit/enumerable/test_count.rb +51 -66
- data/test/unit/enumerable/test_each.rb +77 -0
- data/test/unit/enumerable/test_mash.rb +51 -0
- data/test/unit/enumerable/test_permutation.rb +1 -7
- data/test/unit/enumerable/test_probability.rb +42 -55
- data/test/unit/enumerable/test_split.rb +52 -0
- data/test/unit/exception/test_detail.rb +19 -0
- data/test/unit/file/test_read.rb +34 -0
- data/test/unit/file/test_topath.rb +17 -25
- data/test/unit/file/test_write.rb +6 -12
- data/test/unit/filetest/test_root.rb +14 -0
- data/test/unit/hash/test_at.rb +9 -21
- data/test/unit/hash/test_delete.rb +22 -37
- data/test/unit/hash/test_has_keys.rb +13 -28
- data/test/unit/hash/test_insert.rb +9 -23
- data/test/unit/hash/test_inverse.rb +11 -26
- data/test/unit/hash/test_iterate.rb +16 -31
- data/test/unit/hash/test_keyize.rb +40 -55
- data/test/unit/hash/test_merge.rb +10 -25
- data/test/unit/hash/test_new.rb +9 -24
- data/test/unit/hash/test_op.rb +1 -7
- data/test/unit/hash/test_rekey.rb +47 -62
- data/test/unit/hash/test_traverse.rb +17 -32
- data/test/unit/hash/test_update.rb +30 -45
- data/test/unit/hash/test_weave.rb +10 -23
- data/test/unit/integer/test_bitmask.rb +48 -44
- data/test/unit/integer/test_factorial.rb +11 -26
- data/test/unit/integer/test_multiples.rb +1 -5
- data/test/unit/integer/test_of.rb +14 -29
- data/test/unit/kernel/test_callstack.rb +13 -28
- data/test/unit/kernel/test_constant.rb +14 -28
- data/test/unit/kernel/test_deepcopy.rb +20 -35
- data/test/unit/kernel/test_instance.rb +46 -61
- data/test/unit/kernel/test_metaid.rb +42 -57
- data/test/unit/kernel/test_object.rb +14 -29
- data/test/unit/kernel/test_populate.rb +38 -53
- data/test/unit/kernel/test_report.rb +1 -7
- data/test/unit/kernel/test_returning.rb +16 -0
- data/test/unit/kernel/test_silence.rb +8 -23
- data/test/unit/kernel/test_super.rb +41 -56
- data/test/unit/kernel/test_tap.rb +15 -39
- data/test/unit/kernel/test_val.rb +7 -20
- data/test/unit/kernel/test_withattr.rb +29 -44
- data/test/unit/matchdata/test_matchset.rb +20 -35
- data/test/unit/module/test_abstract.rb +15 -30
- data/test/unit/module/test_alias.rb +32 -45
- data/test/unit/module/test_cattr.rb +39 -54
- data/test/unit/module/test_clone.rb +31 -43
- data/test/unit/module/test_include.rb +1 -35
- data/test/unit/module/test_modify.rb +102 -114
- data/test/unit/module/test_name.rb +1 -7
- data/test/unit/numeric/test_round.rb +46 -61
- data/test/unit/proc/test_bind.rb +29 -44
- data/test/unit/proc/test_compose.rb +20 -35
- data/test/unit/range/test_combine.rb +14 -29
- data/test/unit/range/test_overlap.rb +34 -51
- data/test/unit/regexp/test_arity.rb +14 -29
- data/test/unit/string/test_align.rb +13 -27
- data/test/unit/string/test_blank.rb +12 -27
- data/test/unit/string/test_bracket.rb +52 -67
- data/test/unit/string/test_case.rb +19 -38
- data/test/unit/string/test_crypt.rb +10 -25
- data/test/unit/string/test_filter.rb +1 -7
- data/test/unit/string/test_format.rb +2 -7
- data/test/unit/string/test_indexable.rb +54 -69
- data/test/unit/string/test_interpolate.rb +8 -21
- data/test/unit/string/test_natcmp.rb +11 -26
- data/test/unit/string/test_nchar.rb +1 -14
- data/test/unit/string/test_op.rb +14 -0
- data/test/unit/string/test_partitions.rb +39 -54
- data/test/unit/string/test_range.rb +17 -32
- data/test/unit/string/test_regesc.rb +1 -7
- data/test/unit/string/test_scan.rb +23 -38
- data/test/unit/string/test_stackable.rb +79 -98
- data/test/unit/string/test_tabs.rb +1 -7
- data/test/unit/symbol/test_chomp.rb +10 -21
- data/test/unit/symbol/test_generate.rb +7 -22
- data/test/unit/symbol/test_not.rb +10 -25
- data/test/unit/symbol/test_shadow.rb +8 -23
- data/test/unit/symbol/test_succ.rb +1 -7
- data/test/unit/symbol/test_to_proc.rb +1 -7
- data/test/unit/test_attributes.rb +1 -1
- data/test/unit/test_continuation.rb +13 -0
- data/test/unit/test_conversion.rb +1 -14
- data/test/unit/test_namespace.rb +30 -3
- data/test/unit/test_thread.rb +23 -0
- data/test/unit/time/test_change.rb +11 -26
- data/test/unit/time/test_elapse.rb +10 -25
- data/test/unit/time/test_stamp.rb +28 -0
- metadata +65 -25
- data/lib/core/facets/array/unzip.rb +0 -14
- data/lib/core/facets/continuation.rb +0 -1
- data/lib/core/facets/enumerable/collate.rb +0 -104
- data/lib/core/facets/kernel/require_esc.rb +0 -44
- data/lib/more/facets/mapsend.rb +0 -98
- data/lib/more/facets/pp_s.rb +0 -30
- data/log/history.rd +0 -38
- data/log/todo.rd +0 -4
- data/task/special/quickopts +0 -15
- data/test/unit/continuation/test_create.rb +0 -28
- data/test/unit/enumerable/test_collate.rb +0 -51
- data/test/unit/kernel/test_require_esc.rb +0 -29
- data/test/unit/test_mapsend.rb +0 -18
- data/test/unit/test_pp_s.rb +0 -17
data/lib/core/facets/hash/at.rb
CHANGED
@@ -1,44 +1,14 @@
|
|
1
|
-
# TITLE:
|
2
|
-
#
|
3
|
-
# Hash At
|
4
|
-
#
|
5
|
-
# SUMMARY:
|
6
|
-
#
|
7
|
-
# Alias #at and #/ to #[].
|
8
|
-
#
|
9
|
-
# CREDITS:
|
10
|
-
#
|
11
|
-
# - Thomas Sawyer
|
12
|
-
|
13
|
-
#
|
14
1
|
class Hash
|
15
2
|
|
16
|
-
# Use division as a fetch notation.
|
3
|
+
# Use division operator as a fetch notation.
|
4
|
+
#
|
5
|
+
# h = {:a=>1}
|
6
|
+
# h / :a #=> 1
|
7
|
+
|
17
8
|
alias_method :/, :[]
|
18
9
|
|
19
|
-
#
|
10
|
+
# Alias for fetch for greater polymorphism with Array.
|
11
|
+
#
|
20
12
|
alias_method :at, :[]
|
21
13
|
|
22
14
|
end
|
23
|
-
|
24
|
-
|
25
|
-
# _____ _
|
26
|
-
# |_ _|__ ___| |_
|
27
|
-
# | |/ _ \/ __| __|
|
28
|
-
# | | __/\__ \ |_
|
29
|
-
# |_|\___||___/\__|
|
30
|
-
#
|
31
|
-
=begin test
|
32
|
-
|
33
|
-
require 'test/unit'
|
34
|
-
|
35
|
-
class TestHashAt < Test::Unit::TestCase
|
36
|
-
|
37
|
-
def test_at
|
38
|
-
h = { :a=>1, :b=>2 }
|
39
|
-
assert_equal( 1, h.at(:a) )
|
40
|
-
assert_equal( 2, h.at(:b) )
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
=end
|
@@ -1,42 +1,30 @@
|
|
1
|
-
# TITLE:
|
2
|
-
#
|
3
|
-
# Hash Deletion Extensions
|
4
|
-
#
|
5
|
-
# SUMMARY:
|
6
|
-
#
|
7
|
-
# General manipulation extensions for Hash class.
|
8
|
-
#
|
9
|
-
# CREDITS:
|
10
|
-
#
|
11
|
-
# - Daniel Schierbeck
|
12
|
-
# - Thomas Sawyer
|
13
|
-
|
14
|
-
#
|
15
1
|
class Hash
|
16
2
|
|
17
3
|
alias_method :delete_at, :delete
|
18
4
|
|
19
|
-
#
|
5
|
+
# Inverse of #delete_if.
|
6
|
+
#
|
7
|
+
#
|
8
|
+
#
|
9
|
+
# CREDIT: Daniel Schierbeck
|
20
10
|
|
21
11
|
def delete_unless #:yield:
|
22
12
|
delete_if{ |key, value| ! yield(key, value) }
|
23
13
|
end
|
24
14
|
|
25
|
-
# CREDIT Daniel Schierbeck
|
26
|
-
|
27
15
|
# Minor modification to Ruby's Hash#delete method
|
28
16
|
# allowing it to take multiple keys.
|
29
17
|
#
|
30
18
|
# hsh = { :a => 1, :b => 2 }
|
31
19
|
# hsh.delete_values(1)
|
32
20
|
# hsh #=> { :b => 2 }
|
21
|
+
#
|
22
|
+
# CREDIT: Daniel Schierbeck
|
33
23
|
|
34
24
|
def delete_values(*values)
|
35
25
|
keys.map{ |key| delete(key) if values.include?(fetch(key)) }
|
36
26
|
end
|
37
27
|
|
38
|
-
# CREDIT Daniel Schierbeck
|
39
|
-
|
40
28
|
# Minor modification to Ruby's Hash#delete method
|
41
29
|
# allowing it to take multiple keys.
|
42
30
|
#
|
@@ -48,48 +36,11 @@ class Hash
|
|
48
36
|
#
|
49
37
|
# [a, b, c] #=> [1, 2, 3]
|
50
38
|
# hsh #=> {}
|
39
|
+
#
|
40
|
+
# CREDIT: Daniel Schierbeck
|
51
41
|
|
52
42
|
def delete_values_at(*keys, &yld)
|
53
43
|
keys.map{|key| delete(key, &yld) }
|
54
44
|
end
|
55
45
|
|
56
46
|
end
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
# _____ _
|
61
|
-
# |_ _|__ ___| |_
|
62
|
-
# | |/ _ \/ __| __|
|
63
|
-
# | | __/\__ \ |_
|
64
|
-
# |_|\___||___/\__|
|
65
|
-
#
|
66
|
-
=begin test
|
67
|
-
|
68
|
-
require 'test/unit'
|
69
|
-
|
70
|
-
class TestHashDelete < Test::Unit::TestCase
|
71
|
-
|
72
|
-
def test_delete_unless
|
73
|
-
a = { :a => 1, :b => 2, :c => 3 }
|
74
|
-
e = { :a => 1 }
|
75
|
-
r = a.delete_unless{|k,v| v == 1}
|
76
|
-
assert_equal( e, a )
|
77
|
-
end
|
78
|
-
|
79
|
-
def test_delete_values
|
80
|
-
a = { :a => 1, :b => 2, :c => 3 }
|
81
|
-
e = { :b => 2, :c => 3 }
|
82
|
-
r = a.delete_values(1)
|
83
|
-
assert_equal( e, a )
|
84
|
-
end
|
85
|
-
|
86
|
-
def test_delete_values_at
|
87
|
-
a = { :a => 1, :b => 2, :c => 3 }
|
88
|
-
e = { :b => 2, :c => 3 }
|
89
|
-
r = a.delete_values_at(:a)
|
90
|
-
assert_equal( e, a )
|
91
|
-
end
|
92
|
-
|
93
|
-
end
|
94
|
-
|
95
|
-
=end
|
@@ -1,16 +1,3 @@
|
|
1
|
-
# TITLE:
|
2
|
-
#
|
3
|
-
# Hash Comparison Extensions
|
4
|
-
#
|
5
|
-
# SUMMARY:
|
6
|
-
#
|
7
|
-
# Hash comparison extensions.
|
8
|
-
#
|
9
|
-
# CREDITS:
|
10
|
-
#
|
11
|
-
# - Thomas Sawyer
|
12
|
-
#
|
13
|
-
|
14
1
|
class Hash
|
15
2
|
|
16
3
|
# Returns true or false whether the hash
|
@@ -19,6 +6,8 @@ class Hash
|
|
19
6
|
# h = { :a => 1, :b => 2 }
|
20
7
|
# h.has_keys?( :a ) #=> true
|
21
8
|
# h.has_keys?( :c ) #=> false
|
9
|
+
#
|
10
|
+
# CREDIT: Trans
|
22
11
|
|
23
12
|
def has_keys?(*check_keys)
|
24
13
|
unknown_keys = check_keys - self.keys
|
@@ -31,6 +20,8 @@ class Hash
|
|
31
20
|
# h = { :a => 1, :b => 2 }
|
32
21
|
# h.has_only_keys?( :a, :b ) #=> true
|
33
22
|
# h.has_only_keys?( :a ) #=> false
|
23
|
+
#
|
24
|
+
# CREDIT: Trans
|
34
25
|
|
35
26
|
def has_only_keys?(*check_keys)
|
36
27
|
unknown_keys = self.keys - check_keys
|
@@ -38,33 +29,3 @@ class Hash
|
|
38
29
|
end
|
39
30
|
|
40
31
|
end
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
# _____ _
|
45
|
-
# |_ _|__ ___| |_
|
46
|
-
# | |/ _ \/ __| __|
|
47
|
-
# | | __/\__ \ |_
|
48
|
-
# |_|\___||___/\__|
|
49
|
-
#
|
50
|
-
=begin test
|
51
|
-
|
52
|
-
require 'test/unit'
|
53
|
-
|
54
|
-
class TestHashHasKeys < Test::Unit::TestCase
|
55
|
-
|
56
|
-
# TODO Write test for Hash#diff.
|
57
|
-
|
58
|
-
def test_has_keys?
|
59
|
-
assert( { :a=>1,:b=>2,:c=>3 }.has_keys?(:a,:b) )
|
60
|
-
assert( ! { :a=>1,:b=>2,:c=>3 }.has_keys?(:a,:b,:d) )
|
61
|
-
end
|
62
|
-
|
63
|
-
def test_has_only_keys?
|
64
|
-
assert( { :a=>1,:b=>2,:c=>3 }.has_only_keys?(:a,:b,:c) )
|
65
|
-
assert( ! { :a=>1,:b=>2,:c=>3 }.has_only_keys?(:a,:b) )
|
66
|
-
end
|
67
|
-
|
68
|
-
end
|
69
|
-
|
70
|
-
=end
|
@@ -1,23 +1,12 @@
|
|
1
|
-
# TITLE:
|
2
|
-
#
|
3
|
-
# Hash Insert
|
4
|
-
#
|
5
|
-
# SUMMARY:
|
6
|
-
#
|
7
|
-
# As with #store but only if the key isn't already in the hash.
|
8
|
-
#
|
9
|
-
# CREDITS:
|
10
|
-
#
|
11
|
-
# - Thomas Sawyer
|
12
|
-
|
13
|
-
#
|
14
1
|
class Hash
|
15
2
|
|
16
3
|
# As with #store but only if the key isn't
|
17
4
|
# already in the hash.
|
18
|
-
|
19
|
-
#
|
20
|
-
|
5
|
+
#
|
6
|
+
# TODO: Would #store? be a better name?
|
7
|
+
#
|
8
|
+
# CREDIT: Trans
|
9
|
+
|
21
10
|
def insert(name, value)
|
22
11
|
if key?(name)
|
23
12
|
false
|
@@ -28,25 +17,3 @@ class Hash
|
|
28
17
|
end
|
29
18
|
|
30
19
|
end
|
31
|
-
|
32
|
-
|
33
|
-
# _____ _
|
34
|
-
# |_ _|__ ___| |_
|
35
|
-
# | |/ _ \/ __| __|
|
36
|
-
# | | __/\__ \ |_
|
37
|
-
# |_|\___||___/\__|
|
38
|
-
#
|
39
|
-
=begin test
|
40
|
-
|
41
|
-
require 'test/unit'
|
42
|
-
|
43
|
-
class TestHashInsert < Test::Unit::TestCase
|
44
|
-
|
45
|
-
def test_insert
|
46
|
-
h = { :a=>1, :b=>2 }
|
47
|
-
assert_equal( true , h.insert(:c,3) )
|
48
|
-
assert_equal( false , h.insert(:a,0) )
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
=end
|
@@ -1,21 +1,5 @@
|
|
1
|
-
# TITLE:
|
2
|
-
#
|
3
|
-
# Hash Inverse
|
4
|
-
#
|
5
|
-
# SUMMARY:
|
6
|
-
#
|
7
|
-
# Create a "true" inverse hash by storing mutliple values
|
8
|
-
# in Arrays.
|
9
|
-
#
|
10
|
-
# CREDITS:
|
11
|
-
#
|
12
|
-
# - Tilo Sloboda
|
13
|
-
|
14
|
-
#
|
15
1
|
class Hash
|
16
2
|
|
17
|
-
# CREDIT Tilo Sloboda
|
18
|
-
|
19
3
|
# Create a "true" inverse hash by storing mutliple values
|
20
4
|
# in Arrays.
|
21
5
|
#
|
@@ -25,6 +9,8 @@ class Hash
|
|
25
9
|
# h.inverse #=> {2=>"d", 3=>["f", "c", "b", "a"], 9=>["g", "e"]}
|
26
10
|
# h.inverse.inverse #=> {"a"=>3, "b"=>3, "c"=>3, "d"=>2, "e"=>9, "f"=>3, "g"=>9}
|
27
11
|
# h.inverse.inverse == h #=> true
|
12
|
+
#
|
13
|
+
# CREDIT: Tilo Sloboda
|
28
14
|
|
29
15
|
def inverse
|
30
16
|
i = Hash.new
|
@@ -39,28 +25,3 @@ class Hash
|
|
39
25
|
end
|
40
26
|
|
41
27
|
end
|
42
|
-
|
43
|
-
|
44
|
-
# _____ _
|
45
|
-
# |_ _|__ ___| |_
|
46
|
-
# | |/ _ \/ __| __|
|
47
|
-
# | | __/\__ \ |_
|
48
|
-
# |_|\___||___/\__|
|
49
|
-
#
|
50
|
-
=begin test
|
51
|
-
|
52
|
-
require 'test/unit'
|
53
|
-
|
54
|
-
class TestHashInverse < Test::Unit::TestCase
|
55
|
-
|
56
|
-
def test_inverse
|
57
|
-
h1 = { :a=>1, :b=>2, :c=>2 }
|
58
|
-
h2 = h1.inverse
|
59
|
-
assert_equal( :a, h2[1] )
|
60
|
-
assert( h2[2].include?(:b) )
|
61
|
-
assert( h2[2].include?(:c) )
|
62
|
-
end
|
63
|
-
|
64
|
-
end
|
65
|
-
|
66
|
-
=end
|
@@ -1,20 +1,9 @@
|
|
1
|
-
# TITLE:
|
2
|
-
#
|
3
|
-
# Hash Iteration Extensions
|
4
|
-
#
|
5
|
-
# SUMMARY:
|
6
|
-
#
|
7
|
-
# Iteration related extensions for Hash class.
|
8
|
-
#
|
9
|
-
# CREDIT:
|
10
|
-
#
|
11
|
-
# - Thomas Sawyer
|
12
|
-
|
13
|
-
#
|
14
1
|
class Hash
|
15
2
|
|
16
3
|
# Each with key is like each_pair but reverses the order
|
17
4
|
# the parameters to [value,key] instead of [key,value].
|
5
|
+
#
|
6
|
+
# CREDIT: Trans
|
18
7
|
|
19
8
|
def each_with_key( &yld )
|
20
9
|
each_pair{ |k,v| yld.call(v,k) }
|
@@ -29,41 +18,11 @@ class Hash
|
|
29
18
|
# {:a=>1,:b=>2}.pairs_at(:a,:c) #=> {:a=>1, :c=>nil}
|
30
19
|
#
|
31
20
|
# The later form is equivalent to #pairs_at.
|
21
|
+
#
|
22
|
+
# CREDIT: Trans
|
32
23
|
|
33
24
|
def pairs_at( *keys )
|
34
25
|
keys.inject({}) {|h,k| h[k] = self[k]; h}
|
35
26
|
end
|
36
27
|
|
37
28
|
end
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
# _____ _
|
42
|
-
# |_ _|__ ___| |_
|
43
|
-
# | |/ _ \/ __| __|
|
44
|
-
# | | __/\__ \ |_
|
45
|
-
# |_|\___||___/\__|
|
46
|
-
#
|
47
|
-
=begin test
|
48
|
-
|
49
|
-
require 'test/unit'
|
50
|
-
|
51
|
-
class TestHashIterate < Test::Unit::TestCase
|
52
|
-
|
53
|
-
def test_each_with_key
|
54
|
-
h1 = { :a=>1, :b=>2 }
|
55
|
-
h2 = {}
|
56
|
-
h1.each_with_key { |v,k| h2[v] = k }
|
57
|
-
assert_equal( {1=>:a, 2=>:b}, h2 )
|
58
|
-
end
|
59
|
-
|
60
|
-
def test_each_with_key
|
61
|
-
h1 = { :a=>1, :b=>2 }
|
62
|
-
h2 = {}
|
63
|
-
h1.each_with_index { |v,k| h2[v] = k }
|
64
|
-
assert_equal( {1=>:a, 2=>:b}, h2 )
|
65
|
-
end
|
66
|
-
|
67
|
-
end
|
68
|
-
|
69
|
-
=end
|
@@ -1,25 +1,9 @@
|
|
1
|
-
# TITLE:
|
2
|
-
#
|
3
|
-
# Hash Key-ize Extensions
|
4
|
-
#
|
5
|
-
# SUMMARY:
|
6
|
-
#
|
7
|
-
# Extensions of Hash for converting keys.
|
8
|
-
#
|
9
|
-
# CREDIT:
|
10
|
-
#
|
11
|
-
# - David H. H.
|
12
|
-
# - Thomas Sawyer
|
13
|
-
#
|
14
|
-
# NOTES:
|
15
|
-
#
|
16
|
-
# - These methods are largely usurped by Hash#rekey.
|
17
|
-
# They remain available for the time being for improved
|
18
|
-
# intercompability with Rail's ActiveSupport library.
|
19
|
-
|
20
|
-
#
|
21
1
|
class Hash
|
22
2
|
|
3
|
+
# NOTE: These methods are largely usurped by Hash#rekey.
|
4
|
+
# They remain available for the time being for improved
|
5
|
+
# intercompability with Rail's ActiveSupport library.
|
6
|
+
|
23
7
|
# Converts all keys in the Hash accroding to the given block.
|
24
8
|
# If the block return +nil+ for given key, then that key will be
|
25
9
|
# left intact.
|
@@ -28,9 +12,8 @@ class Hash
|
|
28
12
|
# foo.normalize_keys{ |k| k.to_s } #=> { "name"=>"Gavin", "wife"=>:Lisa }
|
29
13
|
# foo.inspect #=> { :name =>"Gavin", :wife=>:Lisa }
|
30
14
|
#
|
31
|
-
|
32
|
-
#
|
33
|
-
#++
|
15
|
+
# CREDIT: Trans
|
16
|
+
# CREDIT: Gavin Sinclair
|
34
17
|
|
35
18
|
def normalize_keys( &block )
|
36
19
|
dup.send(:normalize_keys!, &block)
|
@@ -42,9 +25,8 @@ class Hash
|
|
42
25
|
# foo.normalize_keys!{ |k| k.to_s } #=> { "name"=>"Gavin", "wife"=>:Lisa }
|
43
26
|
# foo.inspect #=> { "name"=>"Gavin", "wife"=>:Lisa }
|
44
27
|
#
|
45
|
-
|
46
|
-
#
|
47
|
-
#++
|
28
|
+
# CREDIT: Trans
|
29
|
+
# CREDIT: Gavin Sinclair
|
48
30
|
|
49
31
|
def normalize_keys!( &block )
|
50
32
|
keys.each{ |k|
|
@@ -61,9 +43,8 @@ class Hash
|
|
61
43
|
# foo.stringify_keys #=> { "name"=>"Gavin", "wife"=>:Lisa }
|
62
44
|
# foo.inspect #=> { :name =>"Gavin", :wife=>:Lisa }
|
63
45
|
#
|
64
|
-
|
65
|
-
#
|
66
|
-
#++
|
46
|
+
# CREDIT: Trans
|
47
|
+
# CREDIT: Gavin Sinclair
|
67
48
|
|
68
49
|
def stringify_keys( &filter )
|
69
50
|
if filter
|
@@ -82,9 +63,9 @@ class Hash
|
|
82
63
|
# foo.stringify_keys! #=> { "name"=>"Gavin", "wife"=>:Lisa }
|
83
64
|
# foo.inspect #=> { "name"=>"Gavin", "wife"=>:Lisa }
|
84
65
|
#
|
85
|
-
|
86
|
-
#
|
87
|
-
|
66
|
+
# CREDIT: Trans
|
67
|
+
# CREDIT: Gavin Sinclair
|
68
|
+
|
88
69
|
def stringify_keys!( &filter )
|
89
70
|
if filter
|
90
71
|
normalize_keys!{ |k| filter[k] ? k.to_s : nil }
|
@@ -102,9 +83,8 @@ class Hash
|
|
102
83
|
# foo.symbolize_keys #=> { :name=>"Gavin", :wife=>:Lisa }
|
103
84
|
# foo.inspect #=> { "name" =>"Gavin", "wife"=>:Lisa }
|
104
85
|
#
|
105
|
-
|
106
|
-
#
|
107
|
-
#++
|
86
|
+
# CREDIT: Trans
|
87
|
+
# CREDIT: Gavin Sinclair
|
108
88
|
|
109
89
|
def symbolize_keys( &filter )
|
110
90
|
if filter
|
@@ -129,9 +109,8 @@ class Hash
|
|
129
109
|
# foo.symbolize_keys! #=> { :name=>"Gavin", :wife=>:Lisa }
|
130
110
|
# foo.inspect #=> { :name=>"Gavin", :wife=>:Lisa }
|
131
111
|
#
|
132
|
-
|
133
|
-
#
|
134
|
-
#++
|
112
|
+
# CREDIT: Trans
|
113
|
+
# CREDIT: Gavin Sinclair
|
135
114
|
|
136
115
|
def symbolize_keys!( &filter )
|
137
116
|
if filter
|
@@ -157,6 +136,10 @@ class Hash
|
|
157
136
|
# foo = { :name=>'Gavin', :wife=>:Lisa }
|
158
137
|
# foo.variablize_keys #=> { "@name"=>"Gavin", "@wife"=>:Lisa }
|
159
138
|
# foo.inspect #=> { :name =>"Gavin", :wife=>:Lisa }
|
139
|
+
#
|
140
|
+
# CREDIT: Trans
|
141
|
+
# CREDIT: David Hansson
|
142
|
+
|
160
143
|
|
161
144
|
def variablize_keys( of_class=nil )
|
162
145
|
self.dup.variablize_keys!( of_class )
|
@@ -169,6 +152,9 @@ class Hash
|
|
169
152
|
# foo = { :name=>'Gavin', :wife=>:Lisa }
|
170
153
|
# foo.variablize_keys! #=> { "@name"=>"Gavin", "@wife"=>:Lisa }
|
171
154
|
# foo.inspect #=> { "@name"=>"Gavin", "@wife"=>:Lisa }
|
155
|
+
#
|
156
|
+
# CREDIT: Trans
|
157
|
+
# CREDIT: David Hansson
|
172
158
|
|
173
159
|
def variablize_keys!( of_class=nil )
|
174
160
|
raise ArgumentError, "Parameter must be a class" unless of_class.kind_of?(Class) if of_class
|
@@ -193,57 +179,3 @@ class Hash
|
|
193
179
|
end
|
194
180
|
|
195
181
|
end
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
# _____ _
|
200
|
-
# |_ _|__ ___| |_
|
201
|
-
# | |/ _ \/ __| __|
|
202
|
-
# | | __/\__ \ |_
|
203
|
-
# |_|\___||___/\__|
|
204
|
-
#
|
205
|
-
=begin test
|
206
|
-
|
207
|
-
require 'test/unit'
|
208
|
-
|
209
|
-
class TestHashKeyize < Test::Unit::TestCase
|
210
|
-
|
211
|
-
def test_normalize_keys_01
|
212
|
-
foo = { :a=>1, :b=>2 }
|
213
|
-
assert_equal( { "a"=>1, "b"=>2 }, foo.normalize_keys{|k|k.to_s} )
|
214
|
-
assert_equal( { :a =>1, :b=>2 }, foo )
|
215
|
-
end
|
216
|
-
|
217
|
-
def test_normalize_keys_02
|
218
|
-
foo = { :a=>1, :b=>2 }
|
219
|
-
assert_equal( { "a"=>1, "b"=>2 }, foo.normalize_keys!{|k|k.to_s} )
|
220
|
-
assert_equal( { "a"=>1, "b"=>2 }, foo )
|
221
|
-
end
|
222
|
-
|
223
|
-
def test_keys_to_s
|
224
|
-
foo = { :a=>1, :b=>2 }
|
225
|
-
assert_equal( { "a"=>1, "b"=>2 }, foo.stringify_keys )
|
226
|
-
assert_equal( { :a =>1, :b=>2 }, foo )
|
227
|
-
end
|
228
|
-
|
229
|
-
def test_keys_to_s!
|
230
|
-
foo = { :a=>1, :b=>2 }
|
231
|
-
assert_equal( { "a"=>1, "b"=>2 }, foo.stringify_keys! )
|
232
|
-
assert_equal( { "a"=>1, "b"=>2 }, foo )
|
233
|
-
end
|
234
|
-
|
235
|
-
def test_keys_to_sym
|
236
|
-
foo = { 'a'=>1, 'b'=>2 }
|
237
|
-
assert_equal( { :a=>1, :b=>2 }, foo.symbolize_keys )
|
238
|
-
assert_equal( { "a" =>1, "b"=>2 }, foo )
|
239
|
-
end
|
240
|
-
|
241
|
-
def test_keys_to_sym!
|
242
|
-
foo = { 'a'=>1, 'b'=>2 }
|
243
|
-
assert_equal( { :a=>1, :b=>2 }, foo.symbolize_keys! )
|
244
|
-
assert_equal( { :a=>1, :b=>2 }, foo )
|
245
|
-
end
|
246
|
-
|
247
|
-
end
|
248
|
-
|
249
|
-
=end
|