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
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'facets/namespace' # FIXME
|
2
|
-
|
3
1
|
class Module
|
4
2
|
|
5
3
|
# An alias for #include.
|
@@ -8,17 +6,23 @@ class Module
|
|
8
6
|
# is Enumerable
|
9
7
|
# end
|
10
8
|
#
|
11
|
-
|
9
|
+
# CREDIT: Trans
|
12
10
|
|
13
|
-
#
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
#
|
20
|
-
|
21
|
-
|
11
|
+
#alias_method :is, :include
|
12
|
+
|
13
|
+
def is(*mods)
|
14
|
+
mods.each do |mod|
|
15
|
+
if mod.const_defined?(:Self)
|
16
|
+
extend mod::Self
|
17
|
+
# pass it along if module
|
18
|
+
if instance_of?(Module)
|
19
|
+
const_set(:Self, Module.new) unless const_defined?(:Self)
|
20
|
+
const_get(:Self).send(:include, mod::Self)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
include(*mods)
|
25
|
+
end
|
22
26
|
|
23
27
|
# Expirmental idea for #is.
|
24
28
|
#
|
@@ -53,7 +57,9 @@ class Module
|
|
53
57
|
#
|
54
58
|
# Y.is?(X) #=> true
|
55
59
|
#
|
56
|
-
|
60
|
+
# CREDIT: Trans
|
61
|
+
|
62
|
+
def is?(base)
|
57
63
|
ancestors.slice(1..-1).include?( base )
|
58
64
|
end
|
59
65
|
|
@@ -64,51 +70,55 @@ class Module
|
|
64
70
|
# class Y < X ; end
|
65
71
|
#
|
66
72
|
# X.ancestor?(Y)
|
67
|
-
|
73
|
+
|
68
74
|
def ancestor?( mod )
|
69
75
|
ancestors.include? mod
|
70
76
|
end
|
71
77
|
|
78
|
+
# Alias for #===. This provides a verbal method
|
79
|
+
# for inquery.
|
80
|
+
#
|
81
|
+
# s = "HELLO"
|
82
|
+
# s.class? String #=> true
|
83
|
+
#
|
84
|
+
# CREDIT: Trans
|
85
|
+
|
72
86
|
alias_method :class?, :===
|
73
87
|
|
74
|
-
#
|
75
|
-
#
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
88
|
+
# DEPRECATED
|
89
|
+
# # Both includes and extends a module.
|
90
|
+
# #
|
91
|
+
# # NOTE: If #include and/or #extend returned thier modules then
|
92
|
+
# # one could just do:
|
93
|
+
# #
|
94
|
+
# # extend(*include(M1, M2, ...))
|
95
|
+
# #
|
96
|
+
# # CREDIT: Trans
|
97
|
+
#
|
98
|
+
# def include_and_extend(*mods)
|
99
|
+
# include *mods
|
100
|
+
# extend *mods
|
101
|
+
# end
|
80
102
|
|
81
103
|
# Include module and apply module_fuction to the
|
82
104
|
# included methods.
|
83
105
|
#
|
106
|
+
# CREDIT: Trans
|
107
|
+
|
84
108
|
def include_function_module *mod
|
85
|
-
include
|
86
|
-
module_function
|
109
|
+
include(*mod)
|
110
|
+
module_function(*mod.collect{|m| m.private_instance_methods & m.methods(false)}.flatten)
|
87
111
|
end
|
88
112
|
|
89
|
-
#
|
90
|
-
|
91
|
-
#
|
92
|
-
# def t ; "HERE" ; end
|
93
|
-
# end
|
94
|
-
#
|
95
|
-
# class X
|
96
|
-
# include_as :test => T
|
97
|
-
# def t ; test.t ; end
|
98
|
-
# end
|
113
|
+
# NOTE: include_as is now in more library namespace.rb.
|
114
|
+
|
115
|
+
# A macro for dynamic modules.
|
99
116
|
#
|
100
|
-
#
|
117
|
+
# TODO: This method ecourages a bad practice, and should not be used.
|
118
|
+
# It's here because Nitro uses it, but eventually it will be deprecated.
|
101
119
|
#
|
102
|
-
|
103
|
-
h.each { |name, mod| method_space(name, mod) }
|
104
|
-
end
|
120
|
+
# CREDIT: George Moschovitis
|
105
121
|
|
106
|
-
# A useful macro for dynamic modules.
|
107
|
-
#--
|
108
|
-
# FIXME: quick and easy implementation, should
|
109
|
-
# come up with something better. The name
|
110
|
-
# sucks too.
|
111
|
-
#++
|
112
122
|
def on_included(code)
|
113
123
|
tag = caller[0].split(' ').first.split(/\/|\\/).last.gsub(/:|\.|\(|\)/, '_')
|
114
124
|
old = "__included_#{tag}"
|
@@ -130,88 +140,18 @@ module Kernel
|
|
130
140
|
|
131
141
|
# Convenience alias for #is_a? to go along with #is.
|
132
142
|
#
|
143
|
+
# TODO: Somewhat confusing with Module#is?, should this be deprecated?
|
144
|
+
|
133
145
|
alias_method :is?, :is_a?
|
134
146
|
|
135
147
|
end
|
136
148
|
|
137
149
|
|
138
|
-
# _____ _
|
139
|
-
# |_ _|__ ___| |_
|
140
|
-
# | |/ _ \/ __| __|
|
141
|
-
# | | __/\__ \ |_
|
142
|
-
# |_|\___||___/\__|
|
143
|
-
#
|
144
|
-
=begin test
|
145
|
-
|
146
|
-
require 'test/unit'
|
147
|
-
|
148
|
-
class TestIncludeAs < Test::Unit::TestCase
|
149
|
-
|
150
|
-
module MockModule
|
151
|
-
def x; "X"; end
|
152
|
-
def y; @y; end
|
153
|
-
end
|
154
|
-
|
155
|
-
class MockObject
|
156
|
-
include_as :mod => MockModule
|
157
|
-
|
158
|
-
def initialize
|
159
|
-
@y = "Y"
|
160
|
-
end
|
161
|
-
end
|
162
|
-
|
163
|
-
def test_01
|
164
|
-
m = MockObject.new
|
165
|
-
assert_equal( "X", m.mod.x )
|
166
|
-
end
|
167
|
-
|
168
|
-
def test_02
|
169
|
-
m = MockObject.new
|
170
|
-
assert_equal( "Y", m.mod.y )
|
171
|
-
end
|
172
|
-
|
173
|
-
end
|
174
|
-
|
175
|
-
class TestOnInclude < Test::Unit::TestCase
|
176
|
-
|
177
|
-
module M
|
178
|
-
def self.check ; @@check ; end
|
179
|
-
on_included %{
|
180
|
-
@@check = 1
|
181
|
-
}
|
182
|
-
end
|
183
|
-
|
184
|
-
module Q
|
185
|
-
def self.check ; @@check ; end
|
186
|
-
on_included %{
|
187
|
-
@@check = 1
|
188
|
-
}
|
189
|
-
on_included %{
|
190
|
-
@@check = 2
|
191
|
-
}
|
192
|
-
end
|
193
|
-
|
194
|
-
class C
|
195
|
-
include M
|
196
|
-
include Q
|
197
|
-
end
|
198
|
-
|
199
|
-
def test_included
|
200
|
-
assert_equal(1, M.check)
|
201
|
-
assert_equal(2, Q.check)
|
202
|
-
end
|
203
|
-
|
204
|
-
end
|
205
|
-
|
206
|
-
=end
|
207
|
-
|
208
150
|
|
209
151
|
# demonstration
|
210
152
|
|
211
153
|
=begin demo
|
212
154
|
|
213
|
-
# test
|
214
|
-
|
215
155
|
module T
|
216
156
|
def t ; p self ; end
|
217
157
|
def r ; p self ; end
|
@@ -1,4 +1,3 @@
|
|
1
|
-
|
2
1
|
class Module
|
3
2
|
|
4
3
|
# List all instance_methods, equivalent to
|
@@ -6,29 +5,32 @@ class Module
|
|
6
5
|
# public_instance_methods +
|
7
6
|
# protected_instance_methods +
|
8
7
|
# private_instance_methods
|
8
|
+
#
|
9
|
+
# CREDIT: Trans
|
9
10
|
|
10
|
-
def all_instance_methods(
|
11
|
-
public_instance_methods(
|
12
|
-
protected_instance_methods(
|
13
|
-
private_instance_methods(
|
11
|
+
def all_instance_methods(include_super=true)
|
12
|
+
public_instance_methods(include_super) +
|
13
|
+
protected_instance_methods(include_super) +
|
14
|
+
private_instance_methods(include_super)
|
14
15
|
end
|
15
16
|
|
16
17
|
# Query whether an instance method is defined for the module.
|
17
18
|
#
|
18
|
-
# CREDIT
|
19
|
-
# CREDIT
|
19
|
+
# CREDIT: Gavin Sinclair
|
20
|
+
# CREDIT: Noah Gibbs
|
21
|
+
|
20
22
|
|
21
|
-
def instance_method_defined?(
|
22
|
-
instance_methods(true).find { |m| m ==
|
23
|
+
def instance_method_defined?(meth)
|
24
|
+
instance_methods(true).find { |m| m == meth.to_s }
|
23
25
|
end
|
24
26
|
|
25
27
|
# Query whether a normal (singleton) method is defined for the module.
|
26
28
|
#
|
27
|
-
# CREDIT
|
28
|
-
# CREDIT
|
29
|
+
# CREDIT: Gavin Sinclair
|
30
|
+
# CREDIT: Noah Gibbs
|
29
31
|
|
30
|
-
def module_method_defined?(
|
31
|
-
singleton_methods(true).find { |m| m ==
|
32
|
+
def module_method_defined?(meth)
|
33
|
+
singleton_methods(true).find { |m| m == meth.to_s }
|
32
34
|
end
|
33
35
|
|
34
36
|
end
|
@@ -1,16 +1,3 @@
|
|
1
|
-
# TITLE:
|
2
|
-
#
|
3
|
-
# Module Modify
|
4
|
-
#
|
5
|
-
# SUMMARY:
|
6
|
-
#
|
7
|
-
# Module extensions for modifying a module's methods.
|
8
|
-
#
|
9
|
-
# CREDITS:
|
10
|
-
#
|
11
|
-
# - Thomas Sawyer
|
12
|
-
|
13
|
-
#
|
14
1
|
class Module
|
15
2
|
|
16
3
|
private
|
@@ -49,21 +36,25 @@ class Module
|
|
49
36
|
# This is like #revisal, but #revisal only
|
50
37
|
# returns the reconstructred module. It does not
|
51
38
|
# include it.
|
39
|
+
#
|
40
|
+
# CREDIT: Trans
|
52
41
|
|
53
|
-
def integrate(
|
42
|
+
def integrate(mod, &block)
|
54
43
|
#include mod.revisal( &blk )
|
55
|
-
m = Module.new
|
56
|
-
m.class_eval
|
44
|
+
m = Module.new{ include mod }
|
45
|
+
m.class_eval(&block)
|
57
46
|
include m
|
58
47
|
end
|
59
48
|
|
60
49
|
# Return a new module based on another.
|
61
50
|
# This includes the original module into the new one.
|
51
|
+
#
|
52
|
+
# CREDIT: Trans
|
62
53
|
|
63
|
-
def revisal(
|
54
|
+
def revisal(&blk)
|
64
55
|
base = self
|
65
|
-
nm = Module.new
|
66
|
-
nm.class_eval
|
56
|
+
nm = Module.new{ include base }
|
57
|
+
nm.class_eval(&blk)
|
67
58
|
nm
|
68
59
|
end
|
69
60
|
|
@@ -88,7 +79,9 @@ class Module
|
|
88
79
|
#
|
89
80
|
# Greeter.new.hello #=> "Hello, friend!"
|
90
81
|
#
|
91
|
-
|
82
|
+
# CREDIT: Trans
|
83
|
+
|
84
|
+
def redefine_method(sym, aka=nil, &blk)
|
92
85
|
raise ArgumentError, "method does not exist" unless method_defined?( sym )
|
93
86
|
alias_method( aka, sym ) if aka
|
94
87
|
undef_method( sym )
|
@@ -127,6 +120,8 @@ class Module
|
|
127
120
|
# end
|
128
121
|
# end
|
129
122
|
#
|
123
|
+
# CREDIT: Trans
|
124
|
+
|
130
125
|
def redirect_method( method_hash )
|
131
126
|
method_hash.each do |targ,adv|
|
132
127
|
define_method(targ) { |*args| send(adv,*args) }
|
@@ -139,6 +134,8 @@ class Module
|
|
139
134
|
#
|
140
135
|
# rename_method( :to_method, :from_method )
|
141
136
|
#
|
137
|
+
# CREDIT: Trans
|
138
|
+
|
142
139
|
def rename_method( to_sym, from_sym )
|
143
140
|
raise ArgumentError, "method #{from_sym} does not exist" unless method_defined?( from_sym )
|
144
141
|
alias_method( to_sym, from_sym )
|
@@ -163,6 +160,8 @@ class Module
|
|
163
160
|
#
|
164
161
|
# Keep in mind that this can not be used to wrap methods
|
165
162
|
# that take a block.
|
163
|
+
#
|
164
|
+
# CREDIT: Trans
|
166
165
|
|
167
166
|
def wrap_method( sym, &blk )
|
168
167
|
old = instance_method(sym)
|
@@ -170,190 +169,5 @@ class Module
|
|
170
169
|
end
|
171
170
|
|
172
171
|
alias_method :wrap, :wrap_method
|
173
|
-
end
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
# _____ _
|
178
|
-
# |_ _|__ ___| |_
|
179
|
-
# | |/ _ \/ __| __|
|
180
|
-
# | | __/\__ \ |_
|
181
|
-
# |_|\___||___/\__|
|
182
|
-
#
|
183
|
-
=begin test
|
184
|
-
|
185
|
-
require 'test/unit'
|
186
|
-
|
187
|
-
# integrate
|
188
|
-
|
189
|
-
class TestModuleModifyIntegrate < Test::Unit::TestCase
|
190
|
-
|
191
|
-
module M
|
192
|
-
def x ; 1 ; end
|
193
|
-
end
|
194
|
-
|
195
|
-
class C
|
196
|
-
integrate M do
|
197
|
-
rename :y, :x
|
198
|
-
end
|
199
|
-
end
|
200
|
-
|
201
|
-
def test_integrate
|
202
|
-
c = C.new
|
203
|
-
assert_raises( NoMethodError ) { c.x }
|
204
|
-
assert_equal( 1, c.y )
|
205
|
-
end
|
206
|
-
|
207
|
-
end
|
208
|
-
|
209
|
-
# revisal
|
210
|
-
|
211
|
-
class TestModuleModifyRevisal < Test::Unit::TestCase
|
212
|
-
|
213
|
-
module M
|
214
|
-
def x ; 1 ; end
|
215
|
-
end
|
216
|
-
|
217
|
-
class C
|
218
|
-
include M.revisal {
|
219
|
-
rename :y, :x
|
220
|
-
}
|
221
|
-
end
|
222
|
-
|
223
|
-
def test_revisal
|
224
|
-
c = C.new
|
225
|
-
assert_raises( NoMethodError ) { c.x }
|
226
|
-
assert_equal( 1, c.y )
|
227
|
-
end
|
228
|
-
|
229
|
-
end
|
230
|
-
|
231
|
-
# nodef
|
232
|
-
|
233
|
-
class TestModuleModifyNoDef < Test::Unit::TestCase
|
234
|
-
|
235
|
-
def the_undefined_method ; 'not here' ; end
|
236
|
-
|
237
|
-
nodef :the_undefined_method
|
238
|
-
|
239
|
-
def test_nodef
|
240
|
-
assert( ! respond_to?( :the_undefined_method ) )
|
241
|
-
end
|
242
|
-
|
243
|
-
end
|
244
|
-
|
245
|
-
# redef
|
246
|
-
|
247
|
-
class TestModuleModifyReDef < Test::Unit::TestCase
|
248
|
-
|
249
|
-
# redef_method
|
250
|
-
|
251
|
-
def a; "a"; end
|
252
|
-
|
253
|
-
redefine_method(:a) { nil }
|
254
|
-
|
255
|
-
def test_redefine_method
|
256
|
-
assert_equal( nil, a )
|
257
|
-
end
|
258
|
-
|
259
|
-
# redef
|
260
|
-
|
261
|
-
def b; "b"; end
|
262
|
-
|
263
|
-
redef(:b) { "x" }
|
264
|
-
|
265
|
-
def test_redef
|
266
|
-
assert_equal( "x", b )
|
267
|
-
end
|
268
|
-
|
269
|
-
end
|
270
|
-
|
271
|
-
# redirect_method
|
272
|
-
|
273
|
-
class TestModuleModifyReDirect < Test::Unit::TestCase
|
274
|
-
|
275
|
-
def red1 ; 1 ; end
|
276
|
-
|
277
|
-
redirect_method :red2 => :red1
|
278
|
-
|
279
|
-
def test_redirect
|
280
|
-
assert_equal( 1, red2 )
|
281
|
-
end
|
282
|
-
|
283
|
-
# redirect
|
284
|
-
|
285
|
-
def blue1 ; 1 ; end
|
286
|
-
|
287
|
-
redirect :blue2 => :blue1
|
288
|
-
|
289
|
-
def test_redirect
|
290
|
-
assert_equal( 1, blue2 )
|
291
|
-
end
|
292
|
-
|
293
|
-
end
|
294
|
-
|
295
|
-
# remove method
|
296
|
-
|
297
|
-
class TestModuleModifyRemove < Test::Unit::TestCase
|
298
|
-
|
299
|
-
def the_removed_method ; 'not here' ; end
|
300
|
-
|
301
|
-
remove :the_removed_method
|
302
|
-
|
303
|
-
def test_remove
|
304
|
-
assert( ! respond_to?( :the_removed_method ) )
|
305
|
-
end
|
306
|
-
|
307
|
-
end
|
308
|
-
|
309
|
-
# Rename
|
310
|
-
|
311
|
-
class TestModuleModifyRename < Test::Unit::TestCase
|
312
172
|
|
313
|
-
|
314
|
-
|
315
|
-
rename_method :b, :a
|
316
|
-
|
317
|
-
def test_rename_method
|
318
|
-
assert( ! respond_to?( :a ) )
|
319
|
-
assert( respond_to?( :b ) )
|
320
|
-
end
|
321
|
-
|
322
|
-
# rename
|
323
|
-
|
324
|
-
def c; "C" ; end
|
325
|
-
|
326
|
-
rename :d, :c
|
327
|
-
|
328
|
-
def test_rename
|
329
|
-
assert( ! respond_to?( :c ) )
|
330
|
-
assert( respond_to?( :d ) )
|
331
|
-
end
|
332
|
-
|
333
|
-
end
|
334
|
-
|
335
|
-
# wrap_method
|
336
|
-
|
337
|
-
class TestModuleModifyWrap < Test::Unit::TestCase
|
338
|
-
|
339
|
-
def a; "A"; end
|
340
|
-
|
341
|
-
wrap_method(:a) { |old| old.call + "B" }
|
342
|
-
|
343
|
-
def test_wrap_method
|
344
|
-
assert_equal( "AB", a )
|
345
|
-
end
|
346
|
-
|
347
|
-
# wrap
|
348
|
-
|
349
|
-
def b; "B"; end
|
350
|
-
|
351
|
-
wrap(:b) { |old| old.call + "C" }
|
352
|
-
|
353
|
-
def test_wrap
|
354
|
-
assert_equal( "BC", b )
|
355
|
-
end
|
356
|
-
|
357
|
-
end
|
358
|
-
|
359
|
-
=end
|
173
|
+
end
|