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,22 +1,3 @@
|
|
1
|
-
# TITLE:
|
2
|
-
#
|
3
|
-
# Name
|
4
|
-
#
|
5
|
-
# DESCRIPTION:
|
6
|
-
#
|
7
|
-
# Extensions related to module names and namespace.
|
8
|
-
#
|
9
|
-
# COPYRIGHT:
|
10
|
-
#
|
11
|
-
# Copyright (c) 2007 Gavin Sinclair, Thomas Sawyer
|
12
|
-
# Distributed under the terms of the Ruby License
|
13
|
-
#
|
14
|
-
# AUTHORS:
|
15
|
-
#
|
16
|
-
# - Gavin Sinclair
|
17
|
-
# - Thomas Sawyer
|
18
|
-
|
19
|
-
#
|
20
1
|
class Module
|
21
2
|
|
22
3
|
# <em>Note: the following documentation uses "class" because it's more common, but it
|
@@ -47,15 +28,14 @@ class Module
|
|
47
28
|
# Class.by_name("Enumerable") # -> Enumerable
|
48
29
|
# Module.by_name("Enumerable") # -> Enumerable
|
49
30
|
#
|
50
|
-
|
51
|
-
|
52
|
-
#++
|
31
|
+
# CREDIT: Gavin Sinclair
|
32
|
+
|
53
33
|
def by_name(name)
|
54
34
|
#result = Object.constant(name)
|
55
|
-
#
|
35
|
+
# TODO: Does self need to be Object in the following lines?
|
56
36
|
const = name.to_s.dup
|
57
37
|
base = const.sub!(/^::/, '') ? Object : ( self.kind_of?(Module) ? self : self.class )
|
58
|
-
result = const.split(/::/).inject(base){ |mod,
|
38
|
+
result = const.split(/::/).inject(base){ |mod, subconst| mod.const_get(subconst) }
|
59
39
|
|
60
40
|
return result if result.kind_of?( Module )
|
61
41
|
raise ArgumentError, "#{name} is not a module or class"
|
@@ -78,6 +58,8 @@ class Module
|
|
78
58
|
# m.inspect #=> "#<Module:0xb7bb0434>"
|
79
59
|
# m.basename #=> "Module_0xb7bb0434"
|
80
60
|
#
|
61
|
+
# CREDIT: Trans
|
62
|
+
|
81
63
|
def basename
|
82
64
|
if name and not name.empty?
|
83
65
|
name.gsub(/^.*::/, '')
|
@@ -98,6 +80,8 @@ class Module
|
|
98
80
|
#
|
99
81
|
# See also Module#basename.
|
100
82
|
#
|
83
|
+
# CREDIT: Trans
|
84
|
+
|
101
85
|
def dirname
|
102
86
|
name[0...(name.rindex('::') || 0)]
|
103
87
|
#name.gsub(/::[^:]*$/, '')
|
@@ -114,73 +98,25 @@ class Module
|
|
114
98
|
#
|
115
99
|
# See also Module#basename.
|
116
100
|
#
|
101
|
+
# CREDIT: Trans
|
102
|
+
|
117
103
|
def modspace
|
118
104
|
space = name[ 0...(name.rindex( '::' ) || 0)]
|
119
105
|
space.empty? ? Object : eval(space)
|
120
106
|
end
|
121
107
|
|
122
|
-
|
123
|
-
#
|
124
|
-
#
|
125
|
-
|
108
|
+
# Show a modules nesting in module namespaces.
|
109
|
+
#
|
110
|
+
# A::B::C.nesting #=> [ A, A::B ]
|
111
|
+
#
|
112
|
+
# CREDIT: Trans
|
113
|
+
|
126
114
|
def nesting
|
127
115
|
n = []
|
128
|
-
name.split(/::/).inject(self)
|
116
|
+
name.split(/::/).inject(self) do |mod, name|
|
117
|
+
c = mod.const_get(name) ; n << c ; c
|
118
|
+
end
|
129
119
|
return n
|
130
120
|
end
|
131
121
|
|
132
122
|
end
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
=begin test
|
137
|
-
|
138
|
-
require 'test/unit'
|
139
|
-
|
140
|
-
class TestModuleName < Test::Unit::TestCase
|
141
|
-
|
142
|
-
def test_ancestor
|
143
|
-
assert( self.class.ancestor?(::Test::Unit::TestCase) )
|
144
|
-
end
|
145
|
-
|
146
|
-
def test_by_name
|
147
|
-
c = ::Test::Unit::TestCase.name
|
148
|
-
assert_equal( ::Test::Unit::TestCase, Module.by_name(c) )
|
149
|
-
c = "Test::Unit::TestCase"
|
150
|
-
assert_equal( ::Test::Unit::TestCase, Class.by_name(c) )
|
151
|
-
end
|
152
|
-
|
153
|
-
def test_basename
|
154
|
-
assert_equal( "TestCase", ::Test::Unit::TestCase.basename )
|
155
|
-
end
|
156
|
-
|
157
|
-
def test_dirname
|
158
|
-
assert_equal( 'Test::Unit', Test::Unit::TestCase.dirname )
|
159
|
-
assert_equal( 'Test::Unit', ::Test::Unit::TestCase.dirname )
|
160
|
-
assert_equal( '', Test.dirname )
|
161
|
-
assert_equal( '', ::Test.dirname )
|
162
|
-
end
|
163
|
-
|
164
|
-
def test_modspace
|
165
|
-
assert_equal( Test::Unit, Test::Unit::TestCase.modspace )
|
166
|
-
assert_equal( ::Test::Unit, ::Test::Unit::TestCase.modspace )
|
167
|
-
assert_equal( Object, ::Test.modspace )
|
168
|
-
end
|
169
|
-
|
170
|
-
module M
|
171
|
-
module N
|
172
|
-
class C
|
173
|
-
def n
|
174
|
-
self.class.nesting
|
175
|
-
end
|
176
|
-
end
|
177
|
-
end
|
178
|
-
end
|
179
|
-
|
180
|
-
def test_nesting
|
181
|
-
assert_equal( [TestModuleName, M, M::N, M::N::C], M::N::C.new.n )
|
182
|
-
end
|
183
|
-
|
184
|
-
end
|
185
|
-
|
186
|
-
=end
|
@@ -1,62 +1,57 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
#
|
6
|
-
#
|
7
|
-
#
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
if path =~ /^[\/~.]/
|
19
|
-
file = File.expand_path(path)
|
20
|
-
else
|
21
|
-
$LOAD_PATH.each do |lp|
|
22
|
-
file = File.join(lp,path)
|
23
|
-
break if File.exist?(file)
|
24
|
-
file = nil
|
1
|
+
unless (RUBY_VERSION[0,3] == '1.9')
|
2
|
+
|
3
|
+
class Module
|
4
|
+
|
5
|
+
# Load file into module/class namespace.
|
6
|
+
#
|
7
|
+
# CREDIT: Trans
|
8
|
+
|
9
|
+
def module_load( path )
|
10
|
+
if path =~ /^[\/~.]/
|
11
|
+
file = File.expand_path(path)
|
12
|
+
else
|
13
|
+
$LOAD_PATH.each do |lp|
|
14
|
+
file = File.join(lp,path)
|
15
|
+
break if File.exist?(file)
|
16
|
+
file = nil
|
17
|
+
end
|
25
18
|
end
|
26
|
-
end
|
27
19
|
|
28
|
-
|
29
|
-
|
20
|
+
module_eval(File.read(file))
|
21
|
+
end
|
30
22
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
23
|
+
# Require file into module/class namespace.
|
24
|
+
#
|
25
|
+
# CREDIT: Trans
|
26
|
+
|
27
|
+
def module_require( path )
|
28
|
+
if path =~ /^[\/~.]/
|
29
|
+
file = File.expand_path(path)
|
30
|
+
else
|
31
|
+
$LOAD_PATH.each do |lp|
|
32
|
+
file = File.join(lp,path)
|
33
|
+
break if File.exist?(file)
|
34
|
+
file += '.rb'
|
35
|
+
break if File.exist?(file)
|
36
|
+
file = nil
|
37
|
+
end
|
38
|
+
end
|
39
|
+
@loaded ||= {}
|
40
|
+
if @loaded.key?(file)
|
41
|
+
false
|
42
|
+
else
|
43
|
+
@loaded[file] = true
|
44
|
+
script = File.read(file)
|
45
|
+
module_eval(script)
|
46
|
+
true
|
43
47
|
end
|
44
|
-
end
|
45
|
-
@loaded ||= {}
|
46
|
-
if @loaded.key?(file)
|
47
|
-
false
|
48
|
-
else
|
49
|
-
@loaded[file] = true
|
50
|
-
script = File.read(file)
|
51
|
-
module_eval(script)
|
52
|
-
true
|
53
48
|
end
|
54
49
|
end
|
55
|
-
end
|
56
50
|
|
57
51
|
|
58
|
-
class Class
|
59
|
-
|
60
|
-
|
61
|
-
end
|
52
|
+
class Class
|
53
|
+
alias_method :class_load, :module_load
|
54
|
+
alias_method :class_require, :module_require
|
55
|
+
end
|
62
56
|
|
57
|
+
end
|
@@ -1,33 +1,37 @@
|
|
1
|
-
# TITLE:
|
2
|
-
#
|
3
|
-
# Module Traits
|
4
|
-
#
|
5
|
-
# SUMMARY:
|
6
|
-
#
|
7
|
-
# Module extensions for modifying a module a al traits.
|
8
|
-
#
|
9
|
-
# CREDITS:
|
10
|
-
#
|
11
|
-
# - Thomas Sawyer
|
12
|
-
# - Robert Dober
|
13
|
-
#
|
14
|
-
# NOTES:
|
15
|
-
# - In the old version of traits.rb we cloned modules and
|
16
|
-
# altered their copies. Eg.
|
17
|
-
# def +(other)
|
18
|
-
# mod1 = other.clone
|
19
|
-
# mod2 = clone
|
20
|
-
# mod1.module_eval{ include mod2 }
|
21
|
-
# end
|
22
|
-
# Later it was realized that this thwarted the main
|
23
|
-
# benefit that Ruby's concept of modules has over
|
24
|
-
# traditional traits, inheritance.
|
25
|
-
#
|
26
|
-
|
27
|
-
#
|
28
1
|
class Module
|
29
2
|
|
30
3
|
# Combine modules.
|
4
|
+
#
|
5
|
+
# module A
|
6
|
+
# def a; "a"; end
|
7
|
+
# end
|
8
|
+
#
|
9
|
+
# module B
|
10
|
+
# def b; "b"; end
|
11
|
+
# end
|
12
|
+
#
|
13
|
+
# C = A + B
|
14
|
+
#
|
15
|
+
# class X; include C; end
|
16
|
+
#
|
17
|
+
# X.new.a #=> "a"
|
18
|
+
# X.new.b #=> "b"
|
19
|
+
#
|
20
|
+
# Note that in the old version of traits.rb we cloned
|
21
|
+
# modules and altered their copies. Eg.
|
22
|
+
#
|
23
|
+
# def +(other)
|
24
|
+
# mod1 = other.clone
|
25
|
+
# mod2 = clone
|
26
|
+
# mod1.module_eval{ include mod2 }
|
27
|
+
# end
|
28
|
+
#
|
29
|
+
# Later it was realized that this thwarted the main
|
30
|
+
# benefit that Ruby's concept of modules has over
|
31
|
+
# traditional traits, inheritance.
|
32
|
+
#
|
33
|
+
# CREDIT: Thomas Sawyer
|
34
|
+
# CREDIT: Robert Dober
|
31
35
|
|
32
36
|
def +(other)
|
33
37
|
base = self
|
@@ -38,9 +42,12 @@ class Module
|
|
38
42
|
end
|
39
43
|
|
40
44
|
# Subtract modules.
|
41
|
-
|
42
|
-
#
|
43
|
-
|
45
|
+
#
|
46
|
+
# TODO: Should this use all instance_methods, not just public?
|
47
|
+
#
|
48
|
+
# CREDIT: Thomas Sawyer
|
49
|
+
# CREDIT: Robert Dober
|
50
|
+
|
44
51
|
def -(other)
|
45
52
|
case other
|
46
53
|
when Array
|
@@ -58,6 +65,20 @@ class Module
|
|
58
65
|
end
|
59
66
|
|
60
67
|
# Rename methods.
|
68
|
+
#
|
69
|
+
# module A
|
70
|
+
# def a; "a"; end
|
71
|
+
# end
|
72
|
+
#
|
73
|
+
# B = A * { :a => :b }
|
74
|
+
#
|
75
|
+
# class X; include B; end
|
76
|
+
#
|
77
|
+
# X.new.b #=> "a"
|
78
|
+
#
|
79
|
+
#
|
80
|
+
# CREDIT: Thomas Sawyer
|
81
|
+
# CREDIT: Robert Dober
|
61
82
|
|
62
83
|
def *(rename_map)
|
63
84
|
base = self
|
@@ -71,9 +92,23 @@ class Module
|
|
71
92
|
end
|
72
93
|
|
73
94
|
# Detect conflicts.
|
74
|
-
|
75
|
-
#
|
76
|
-
|
95
|
+
#
|
96
|
+
# module A
|
97
|
+
# def c; end
|
98
|
+
# end
|
99
|
+
#
|
100
|
+
# module B
|
101
|
+
# def c; end
|
102
|
+
# end
|
103
|
+
#
|
104
|
+
# A.conflict?(B) #=> ["c"]
|
105
|
+
#
|
106
|
+
#
|
107
|
+
# TODO: All instance methods, or just public?
|
108
|
+
#
|
109
|
+
# CREDIT: Thomas Sawyer
|
110
|
+
# CREDIT: Robert Dober
|
111
|
+
|
77
112
|
def conflict?(other)
|
78
113
|
c = []
|
79
114
|
c += (public_instance_methods(true) & other.public_instance_methods(true))
|
@@ -87,16 +122,22 @@ class Module
|
|
87
122
|
# c.empty ? false : c
|
88
123
|
#end
|
89
124
|
|
125
|
+
# Like #conflict?, but checks only public methods.
|
126
|
+
|
90
127
|
def public_conflict?(other)
|
91
128
|
c = public_instance_methods(true) & other.public_instance_methods(true)
|
92
129
|
c.empty ? false : c
|
93
130
|
end
|
94
131
|
|
132
|
+
# Like #conflict?, but checks only private methods.
|
133
|
+
|
95
134
|
def private_conflict?(other)
|
96
135
|
c = private_instance_methods(true) & other.private_instance_methods(true)
|
97
136
|
c.empty ? false : c
|
98
137
|
end
|
99
138
|
|
139
|
+
# Like #conflict?, but checks only protected methods.
|
140
|
+
|
100
141
|
def protected_conflict?(other)
|
101
142
|
c = protected_instance_methods(true) & other.protected_instance_methods(true)
|
102
143
|
c.empty ? false : c
|
@@ -1,10 +1,21 @@
|
|
1
|
-
|
2
1
|
class NilClass
|
3
2
|
|
4
3
|
# Nil#status makes it possible to pass messages
|
5
4
|
# through a "failure" chain.
|
5
|
+
#
|
6
|
+
# def foo
|
7
|
+
# return nil.status("failed foo!")
|
8
|
+
# end
|
9
|
+
#
|
10
|
+
# result = foo
|
11
|
+
# if result.nil?
|
12
|
+
# result.status? #=> true
|
13
|
+
# result.status #=> "failed foo!"
|
14
|
+
# end
|
15
|
+
#
|
16
|
+
# CREDIT: Trans
|
6
17
|
|
7
|
-
def status(
|
18
|
+
def status(status=nil)
|
8
19
|
if status
|
9
20
|
@status = status
|
10
21
|
self
|
@@ -14,6 +25,18 @@ class NilClass
|
|
14
25
|
end
|
15
26
|
|
16
27
|
# Check status.
|
28
|
+
#
|
29
|
+
# def foo
|
30
|
+
# return nil.status("failed foo!")
|
31
|
+
# end
|
32
|
+
#
|
33
|
+
# result = foo
|
34
|
+
# if result.nil?
|
35
|
+
# result.status? #=> true
|
36
|
+
# result.status #=> "failed foo!"
|
37
|
+
# end
|
38
|
+
#
|
39
|
+
# CREDIT: Trans
|
17
40
|
|
18
41
|
def status?
|
19
42
|
return unless @status
|
@@ -1,22 +1,13 @@
|
|
1
|
-
# = Round
|
2
|
-
#
|
3
|
-
# To properly support Float's rounding methods,
|
4
|
-
# Numeric and Integer must also be augmented.
|
5
|
-
#
|
6
|
-
# == AUTHORS
|
7
|
-
#
|
8
|
-
# CREDIT Thomas Sawyer
|
9
|
-
|
10
|
-
#
|
11
1
|
class Numeric
|
12
|
-
|
13
|
-
#
|
2
|
+
|
3
|
+
# See Float#round_at.
|
4
|
+
|
14
5
|
def round_at(*args)
|
15
6
|
to_f.round_at(*args)
|
16
7
|
end
|
17
8
|
|
18
|
-
#
|
19
|
-
|
9
|
+
# See Float#round_to.
|
10
|
+
|
20
11
|
def round_to(*args)
|
21
12
|
to_f.round_to(*args)
|
22
13
|
end
|
@@ -24,31 +15,37 @@ class Numeric
|
|
24
15
|
# Determines if another number is approximately equal
|
25
16
|
# within a given _n_th degree. Defaults to 100ths
|
26
17
|
# if the degree is not specified.
|
27
|
-
|
18
|
+
#
|
19
|
+
# CREDIT: Trans
|
20
|
+
|
21
|
+
def approx?(x, n=0.01)
|
28
22
|
return(self == x) if n == 0
|
29
23
|
(self - x).abs <= n
|
30
24
|
end
|
31
25
|
|
32
26
|
end
|
33
27
|
|
34
|
-
|
28
|
+
|
35
29
|
class Integer
|
36
|
-
|
30
|
+
|
31
|
+
# See Float#round_at.
|
32
|
+
|
37
33
|
def round_at(*args)
|
38
34
|
to_f.round_at(*args)
|
39
35
|
end
|
40
36
|
|
41
|
-
#
|
42
|
-
|
37
|
+
# See Float#round_to.
|
38
|
+
|
43
39
|
def round_to(*args)
|
44
40
|
to_f.round_to(*args)
|
45
41
|
end
|
42
|
+
|
46
43
|
end
|
47
44
|
|
48
|
-
|
45
|
+
|
49
46
|
class Float
|
50
|
-
|
51
|
-
#
|
47
|
+
|
48
|
+
# Float#round_off is simply an alias for Float#round.
|
52
49
|
alias_method :round_off, :round
|
53
50
|
|
54
51
|
# Rounds to the given decimal position.
|
@@ -58,6 +55,8 @@ class Float
|
|
58
55
|
# 4.555.round_at(2) #=> 4.56
|
59
56
|
# 4.555.round_at(3) #=> 4.555
|
60
57
|
#
|
58
|
+
# CREDIT: Trans
|
59
|
+
|
61
60
|
def round_at( d ) #d=0
|
62
61
|
(self * (10.0 ** d)).round_off.to_f / (10.0 ** d)
|
63
62
|
end
|
@@ -69,75 +68,11 @@ class Float
|
|
69
68
|
# 4.555.round_to(0.01) #=> 4.56
|
70
69
|
# 4.555.round_to(0) #=> 4.555
|
71
70
|
#
|
71
|
+
# CREDIT: Trans
|
72
|
+
|
72
73
|
def round_to( n ) #n=1
|
73
74
|
return self if n == 0
|
74
75
|
(self * (1.0 / n)).round_off.to_f / (1.0 / n)
|
75
76
|
end
|
76
|
-
end
|
77
77
|
|
78
|
-
|
79
|
-
# _____ _
|
80
|
-
# |_ _|__ ___| |_
|
81
|
-
# | |/ _ \/ __| __|
|
82
|
-
# | | __/\__ \ |_
|
83
|
-
# |_|\___||___/\__|
|
84
|
-
#
|
85
|
-
=begin test
|
86
|
-
|
87
|
-
require 'test/unit'
|
88
|
-
|
89
|
-
class TestRound < Test::Unit::TestCase
|
90
|
-
|
91
|
-
def setup
|
92
|
-
@f0 = [ 0, 10, 15, 105 ]
|
93
|
-
@f1 = [ 10.1, 10.01, 10.9, 10.09, 10.5, 10.05, 10.49 ]
|
94
|
-
end
|
95
|
-
|
96
|
-
def test_round_at_arg1
|
97
|
-
fr = @f0.collect{ |f| f.round_at(1) }
|
98
|
-
assert_equal( [0,10,15,105], fr )
|
99
|
-
fr = @f1.collect { |f| f.round_at(1) }
|
100
|
-
assert_equal( [10.1,10.0,10.9,10.1,10.5,10.1,10.5], fr )
|
101
|
-
end
|
102
|
-
|
103
|
-
def test_round_at_arg2
|
104
|
-
fr = @f0.collect { |f| f.round_at(2) }
|
105
|
-
assert_equal( [0,10,15,105], fr )
|
106
|
-
fr = @f1.collect { |f| f.round_at(2) }
|
107
|
-
assert_equal( [10.1,10.01,10.9,10.09,10.5,10.05,10.49], fr )
|
108
|
-
end
|
109
|
-
|
110
|
-
def test_round_off
|
111
|
-
assert_equal( 1.0, 1.2.round_off )
|
112
|
-
assert_equal( 2.0, 1.8.round_off )
|
113
|
-
end
|
114
|
-
|
115
|
-
def test_round_to_arg1
|
116
|
-
fr = @f0.collect { |f| f.round_to(0.1) }
|
117
|
-
assert_equal( [0,10,15,105], fr )
|
118
|
-
fr = @f1.collect { |f| f.round_to(0.1) }
|
119
|
-
assert_equal( [10.1,10.0,10.9,10.1,10.5,10.1,10.5], fr )
|
120
|
-
end
|
121
|
-
|
122
|
-
def test_round_to_arg10
|
123
|
-
fr = @f0.collect { |f| f.round_to(10) }
|
124
|
-
assert_equal( [0,10,20,110], fr )
|
125
|
-
fr = @f1.collect { |f| f.round_to(10) }
|
126
|
-
assert_equal( [10,10,10,10,10,10,10], fr )
|
127
|
-
end
|
128
|
-
|
129
|
-
def test_round_off
|
130
|
-
assert_equal( 1.0, 1.2.round_off )
|
131
|
-
assert_equal( 2.0, 1.8.round_off )
|
132
|
-
end
|
133
|
-
|
134
|
-
def test_approx?
|
135
|
-
f = 10.006
|
136
|
-
assert( f.approx?(10.01) )
|
137
|
-
assert( f.approx?(10, 0.1) )
|
138
|
-
assert( 100.4.approx?(100.6, 1) )
|
139
|
-
end
|
140
|
-
|
141
|
-
end
|
142
|
-
|
143
|
-
=end
|
78
|
+
end
|