facets 2.0.2 → 2.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/AUTHORS +3 -3
- data/README +6 -7
- data/lib/core/facets.rb +1 -46
- data/lib/core/facets/array.rb +3 -0
- data/lib/core/facets/array/indexable.rb +6 -1
- data/lib/core/facets/array/only.rb +20 -0
- data/lib/core/facets/dir/multiglob.rb +12 -1
- data/lib/core/facets/enumerable.rb +0 -1
- data/lib/core/facets/enumerable/collect.rb +1 -0
- data/lib/core/facets/enumerable/combination.rb +44 -90
- data/lib/core/facets/facets.rb +46 -0
- data/lib/core/facets/file/write.rb +46 -58
- data/lib/core/facets/hash.rb +2 -0
- data/lib/core/facets/hash/select.rb +14 -0
- data/lib/core/facets/integer/multiples.rb +12 -55
- data/lib/core/facets/kernel/val.rb +14 -0
- data/lib/core/facets/module/alias.rb +28 -9
- data/lib/core/facets/module/methods.rb +18 -0
- data/lib/core/facets/module/traits.rb +65 -70
- data/lib/core/facets/proc/compose.rb +15 -12
- data/lib/core/facets/stackable.rb +3 -2
- data/lib/core/facets/string/format.rb +4 -6
- data/lib/core/facets/string/tabs.rb +34 -0
- data/lib/core/facets/symbol.rb +1 -0
- data/lib/core/facets/symbol/succ.rb +1 -42
- data/lib/core/facets/symbol/to_proc.rb +34 -0
- data/lib/methods/facets/array/contains.rb +1 -0
- data/lib/methods/facets/facets/require_core.rb +1 -0
- data/lib/methods/facets/file/writelines.rb +1 -0
- data/lib/methods/facets/io/writelines.rb +1 -0
- data/lib/methods/facets/kernel/not_nil.rb +1 -0
- data/lib/methods/facets/module/conflict.rb +1 -0
- data/lib/methods/facets/module/instance_method_defined.rb +1 -0
- data/lib/methods/facets/module/module_method_defined.rb +1 -0
- data/lib/methods/facets/module/private_conflict.rb +1 -0
- data/lib/methods/facets/module/protected_conflict.rb +1 -0
- data/lib/methods/facets/module/public_conflict.rb +1 -0
- data/lib/methods/facets/string/expand_tabs.rb +1 -0
- data/lib/methods/facets/string/outdent.rb +1 -0
- data/lib/methods/facets/string/taballto.rb +1 -0
- data/lib/more/facets/arguments.rb +1 -1
- data/lib/more/facets/association.rb +0 -46
- data/lib/more/facets/autoarray.rb +0 -28
- data/lib/more/facets/command.rb +341 -8
- data/lib/more/facets/dictionary.rb +25 -131
- data/lib/more/facets/downloader.rb +1 -1
- data/lib/more/facets/infinity.rb +3 -3
- data/lib/more/facets/interval.rb +0 -161
- data/lib/more/facets/multiton.rb +16 -12
- data/lib/more/facets/namespace.rb +1 -1
- data/lib/more/facets/ostruct.rb +46 -10
- data/lib/more/facets/overload.rb +0 -51
- data/lib/more/facets/paramix.rb +0 -97
- data/lib/more/facets/pp_s.rb +30 -0
- data/lib/more/facets/progressbar.rb +18 -10
- data/lib/more/facets/prototype.rb +1 -40
- data/lib/more/facets/random.rb +1 -0
- data/lib/more/facets/rbsystem.rb +4 -1
- data/lib/more/facets/snapshot.rb +8 -1
- data/lib/more/facets/stylize.rb +2 -0
- data/meta/{project.yaml → facets-2.0.3.roll} +22 -14
- data/meta/manifest.txt +38 -8
- data/task/{config.yaml → config/general.yaml} +7 -2
- data/task/{rdoc.yaml → config/rdoc.yaml} +1 -1
- data/task/crosstest +309 -0
- data/task/isotest +293 -0
- data/task/loadtest +28 -0
- data/task/methods +4 -4
- data/task/prepare +5 -0
- data/task/publish +2 -2
- data/task/rdoc +1 -0
- data/task/syntax +29 -0
- data/task/test +0 -1
- data/task/testeach +42 -0
- data/task/testpairs +50 -0
- data/test/lib/rq.rb +15 -0
- data/test/unit/array/test_merge.rb +21 -43
- data/test/unit/array/test_only.rb +21 -0
- data/test/unit/enumerable/test_collect.rb +1 -21
- data/test/unit/enumerable/test_combination.rb +50 -44
- data/test/unit/file/test_topath.rb +48 -57
- data/test/unit/file/test_write.rb +82 -0
- data/test/unit/hash/test_select.rb +43 -0
- data/test/unit/integer/test_multiples.rb +28 -32
- data/test/unit/kernel/test_report.rb +9 -12
- data/test/unit/kernel/test_val.rb +50 -45
- data/test/unit/module/test_include.rb +56 -57
- data/test/unit/module/test_name.rb +42 -55
- data/test/unit/module/test_traits.rb +46 -47
- data/test/unit/string/test_filter.rb +19 -34
- data/test/unit/string/test_format.rb +87 -96
- data/test/unit/string/test_regesc.rb +18 -26
- data/test/unit/string/test_tabs.rb +226 -119
- data/test/unit/symbol/test_succ.rb +14 -23
- data/test/unit/symbol/test_to_proc.rb +41 -0
- data/test/unit/test_association.rb +38 -47
- data/test/unit/test_attributes.rb +24 -33
- data/test/unit/test_autoarray.rb +23 -32
- data/test/unit/test_command.rb +26 -0
- data/test/unit/test_dictionary.rb +123 -117
- data/test/unit/test_infinity.rb +41 -47
- data/test/unit/test_inheritor.rb +133 -142
- data/test/unit/test_interval.rb +129 -93
- data/test/unit/test_ostruct.rb +148 -101
- data/test/unit/test_overload.rb +8 -15
- data/test/unit/test_paramix.rb +67 -73
- data/test/unit/test_pp_s.rb +23 -0
- data/test/unit/test_prototype.rb +28 -38
- metadata +47 -11
- data/lib/core/facets/enumerable/instance_map.rb +0 -0
- data/lib/more/facets/command_options.rb +0 -328
- data/meta/version.txt +0 -1
- data/task/load +0 -39
- data/test/unit/test_command_options.rb +0 -29
data/lib/core/facets/hash.rb
CHANGED
@@ -1,32 +1,26 @@
|
|
1
|
-
# = FILE
|
2
|
-
#
|
3
|
-
# interger/multiple.rb
|
4
|
-
#
|
5
|
-
# = DESCRIPTION
|
6
|
-
#
|
7
|
-
# Multiple related extensions for Integer.
|
8
|
-
#
|
9
|
-
# = AUTHORS
|
10
|
-
#
|
11
|
-
# CREDIT Thomas Sawyer
|
12
|
-
|
13
|
-
|
14
1
|
class Integer
|
15
2
|
|
16
|
-
#
|
3
|
+
# Returns true if this integer is odd, false otherwise.
|
17
4
|
#
|
18
|
-
# 2.odd?
|
19
|
-
# 3.odd?
|
5
|
+
# 2.odd? #=> false
|
6
|
+
# 3.odd? #=> true
|
20
7
|
#
|
8
|
+
# -99.odd? # -> true
|
9
|
+
# -98.odd? # -> false
|
10
|
+
#
|
11
|
+
# CREDIT Gavin Sinclair
|
12
|
+
|
21
13
|
def odd?
|
22
14
|
self % 2 == 1
|
23
15
|
end
|
24
16
|
|
25
|
-
#
|
17
|
+
# Returns true if this integer is even, false otherwise.
|
26
18
|
#
|
27
19
|
# 2.even? #=> true
|
28
20
|
# 3.even? #=> false
|
29
21
|
#
|
22
|
+
# CREDIT Gavin Sinclair
|
23
|
+
|
30
24
|
def even?
|
31
25
|
self % 2 == 0
|
32
26
|
end
|
@@ -36,47 +30,10 @@ class Integer
|
|
36
30
|
# 7.multiple?(2) #=> false
|
37
31
|
# 8.multiple?(2) #=> true
|
38
32
|
#
|
33
|
+
|
39
34
|
def multiple?(number)
|
40
35
|
self % number == 0
|
41
36
|
end
|
42
37
|
|
43
38
|
end
|
44
39
|
|
45
|
-
|
46
|
-
|
47
|
-
# _____ _
|
48
|
-
# |_ _|__ ___| |_
|
49
|
-
# | |/ _ \/ __| __|
|
50
|
-
# | | __/\__ \ |_
|
51
|
-
# |_|\___||___/\__|
|
52
|
-
#
|
53
|
-
=begin test
|
54
|
-
|
55
|
-
require 'test/unit'
|
56
|
-
|
57
|
-
class TCInteger < Test::Unit::TestCase
|
58
|
-
|
59
|
-
def test_odd?
|
60
|
-
assert( ! 0.odd? )
|
61
|
-
assert( 1.odd? )
|
62
|
-
assert( ! 2.odd? )
|
63
|
-
assert( 3.odd? )
|
64
|
-
end
|
65
|
-
|
66
|
-
def test_even?
|
67
|
-
assert( 0.even? )
|
68
|
-
assert( ! 1.even? )
|
69
|
-
assert( 2.even? )
|
70
|
-
assert( ! 3.even? )
|
71
|
-
end
|
72
|
-
|
73
|
-
def test_multiple?
|
74
|
-
assert( ! 1.multiple?(2) )
|
75
|
-
assert( 2.multiple?(2) )
|
76
|
-
assert( ! 5.multiple?(3) )
|
77
|
-
assert( 6.multiple?(3) )
|
78
|
-
end
|
79
|
-
|
80
|
-
end
|
81
|
-
|
82
|
-
=end
|
@@ -10,6 +10,20 @@ module Kernel
|
|
10
10
|
true
|
11
11
|
end
|
12
12
|
|
13
|
+
# The opposite of #nil?.
|
14
|
+
#
|
15
|
+
# "hello".not_nil? # -> true
|
16
|
+
# nil.not_nil? # -> false
|
17
|
+
#
|
18
|
+
# CREDIT Gavin Sinclair
|
19
|
+
|
20
|
+
def not_nil?
|
21
|
+
not nil?
|
22
|
+
end
|
23
|
+
|
24
|
+
# TODO Do not need two of these.
|
25
|
+
#alias_method :non_nil?, :not_nil?
|
26
|
+
|
13
27
|
# Is self included in other?
|
14
28
|
#
|
15
29
|
# 5.in?(0..10) #=> true
|
@@ -13,6 +13,11 @@
|
|
13
13
|
# AUTHORS:
|
14
14
|
#
|
15
15
|
# CREDIT Thomas Saywer
|
16
|
+
#
|
17
|
+
# LOG:
|
18
|
+
#
|
19
|
+
# - 2007.10.31 trans
|
20
|
+
# Made #alias_method_chain compatible with current ActiveSupport version.
|
16
21
|
|
17
22
|
class Module
|
18
23
|
|
@@ -36,9 +41,9 @@ class Module
|
|
36
41
|
# self.y = 2
|
37
42
|
# x #=> 2
|
38
43
|
|
39
|
-
def alias_accessor(
|
40
|
-
alias_method(
|
41
|
-
alias_method(
|
44
|
+
def alias_accessor(name, target)
|
45
|
+
alias_method(name, target)
|
46
|
+
alias_method("#{name}=", "#{target}=")
|
42
47
|
end
|
43
48
|
|
44
49
|
# Alias a module function so that the alias is also
|
@@ -83,18 +88,32 @@ class Module
|
|
83
88
|
# is equivalent to
|
84
89
|
#
|
85
90
|
# alias_method :foo_without_feature?, :foo?
|
86
|
-
# alias_method :foo?, :
|
91
|
+
# alias_method :foo?, :foo_with_feature?
|
87
92
|
#
|
88
93
|
# so you can safely chain foo, foo?, and foo! with the same feature.
|
89
|
-
|
90
|
-
#
|
94
|
+
#
|
95
|
+
# CREDIT Bitsweat and Rails Team.
|
91
96
|
#++
|
97
|
+
|
92
98
|
def alias_method_chain(target, feature)
|
93
99
|
# Strip out punctuation on predicates or bang methods since
|
94
100
|
# e.g. target?_without_feature is not a valid method name.
|
95
|
-
aliased_target, punctuation = target.to_s.sub(/([
|
96
|
-
|
97
|
-
|
101
|
+
aliased_target, punctuation = target.to_s.sub(/([?!=])$/, ''), $1
|
102
|
+
yield(aliased_target, punctuation) if block_given?
|
103
|
+
|
104
|
+
with_method, without_method = "#{aliased_target}_with_#{feature}#{punctuation}", "#{aliased_target}_without_#{feature}#{punctuation}"
|
105
|
+
|
106
|
+
alias_method without_method, target
|
107
|
+
alias_method target, with_method
|
108
|
+
|
109
|
+
case
|
110
|
+
when public_method_defined?(without_method)
|
111
|
+
public target
|
112
|
+
when protected_method_defined?(without_method)
|
113
|
+
protected target
|
114
|
+
when private_method_defined?(without_method)
|
115
|
+
private target
|
116
|
+
end
|
98
117
|
end
|
99
118
|
|
100
119
|
end
|
@@ -13,4 +13,22 @@ class Module
|
|
13
13
|
private_instance_methods(all)
|
14
14
|
end
|
15
15
|
|
16
|
+
# Query whether an instance method is defined for the module.
|
17
|
+
#
|
18
|
+
# CREDIT Noah Gibbs
|
19
|
+
# CREDIT Gavin Sinclair
|
20
|
+
|
21
|
+
def instance_method_defined?(_method)
|
22
|
+
instance_methods(true).find { |m| m == _method.to_s }
|
23
|
+
end
|
24
|
+
|
25
|
+
# Query whether a normal (singleton) method is defined for the module.
|
26
|
+
#
|
27
|
+
# CREDIT Noah Gibbs
|
28
|
+
# CREDIT Gavin Sinclair
|
29
|
+
|
30
|
+
def module_method_defined?(_method)
|
31
|
+
singleton_methods(true).find { |m| m == _method.to_s }
|
32
|
+
end
|
33
|
+
|
16
34
|
end
|
@@ -4,107 +4,102 @@
|
|
4
4
|
#
|
5
5
|
# SUMMARY:
|
6
6
|
#
|
7
|
-
# Module extensions for modifying a module.
|
7
|
+
# Module extensions for modifying a module a al traits.
|
8
8
|
#
|
9
9
|
# CREDITS:
|
10
10
|
#
|
11
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
|
+
#
|
12
26
|
|
13
27
|
#
|
14
28
|
class Module
|
15
29
|
|
16
30
|
# Combine modules.
|
17
31
|
|
18
|
-
def +(
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
# method = other.instance_method(name)
|
25
|
-
# mod.module_eval {
|
26
|
-
# define_method( name, &method )
|
27
|
-
# }
|
28
|
-
#}
|
29
|
-
return mod1
|
32
|
+
def +(other)
|
33
|
+
base = self
|
34
|
+
Module.new do
|
35
|
+
include base
|
36
|
+
include other
|
37
|
+
end
|
30
38
|
end
|
31
39
|
|
32
40
|
# Subtract modules.
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
41
|
+
#--
|
42
|
+
# TODO Should this use all instance_methods, not just public?
|
43
|
+
#++
|
44
|
+
def -(other)
|
37
45
|
case other
|
38
46
|
when Array
|
39
|
-
subtract = instance_methods & other.collect{|m| m.to_s}
|
47
|
+
subtract = instance_methods(true) & other.collect{|m| m.to_s}
|
40
48
|
when Module
|
41
|
-
subtract = instance_methods & other.instance_methods(false
|
49
|
+
subtract = instance_methods(true) & other.instance_methods(true) # false?
|
42
50
|
when String, Symbol
|
43
|
-
subtract = instance_methods & [
|
51
|
+
subtract = instance_methods(true) & [other.to_s]
|
44
52
|
end
|
45
|
-
|
46
|
-
|
47
|
-
|
53
|
+
base = self
|
54
|
+
Module.new do
|
55
|
+
include base
|
56
|
+
subtract.each{ |x| undef_method x }
|
48
57
|
end
|
49
|
-
|
50
|
-
mod
|
51
58
|
end
|
52
59
|
|
53
60
|
# Rename methods.
|
54
61
|
|
55
|
-
def *(
|
56
|
-
|
62
|
+
def *(rename_map)
|
63
|
+
base = self
|
64
|
+
Module.new do
|
65
|
+
include base
|
57
66
|
rename_map.each do |from, to|
|
58
|
-
alias_method
|
59
|
-
|
67
|
+
alias_method to, from
|
68
|
+
undef_method from
|
60
69
|
end
|
61
70
|
end
|
62
|
-
self
|
63
71
|
end
|
64
72
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
require 'test/unit'
|
77
|
-
|
78
|
-
class TestModuleTraits < Test::Unit::TestCase
|
79
|
-
|
80
|
-
module A
|
81
|
-
def x; "x"; end
|
82
|
-
def z; "zA"; end
|
83
|
-
end
|
84
|
-
|
85
|
-
module B
|
86
|
-
def y; "y"; end
|
87
|
-
def z; "zB"; end
|
88
|
-
end
|
73
|
+
# Detect conflicts.
|
74
|
+
#--
|
75
|
+
# TODO All instance methods, or just public?
|
76
|
+
#++
|
77
|
+
def conflict?(other)
|
78
|
+
c = []
|
79
|
+
c += (public_instance_methods(true) & other.public_instance_methods(true))
|
80
|
+
c += (private_instance_methods(true) & other.private_instance_methods(true))
|
81
|
+
c += (protected_instance_methods(true) & other.protected_instance_methods(true))
|
82
|
+
c.empty ? false : c
|
83
|
+
end
|
89
84
|
|
90
|
-
|
91
|
-
|
85
|
+
#def conflict?(other)
|
86
|
+
# c = instance_methods & other.instance_methods
|
87
|
+
# c.empty ? false : c
|
88
|
+
#end
|
92
89
|
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
assert_equal( "y", Q.y )
|
98
|
-
assert_equal( "zB", Q.z )
|
99
|
-
end
|
90
|
+
def public_conflict?(other)
|
91
|
+
c = public_instance_methods(true) & other.public_instance_methods(true)
|
92
|
+
c.empty ? false : c
|
93
|
+
end
|
100
94
|
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
assert_raises( NoMethodError ){ R.z }
|
106
|
-
end
|
95
|
+
def private_conflict?(other)
|
96
|
+
c = private_instance_methods(true) & other.private_instance_methods(true)
|
97
|
+
c.empty ? false : c
|
98
|
+
end
|
107
99
|
|
100
|
+
def protected_conflict?(other)
|
101
|
+
c = protected_instance_methods(true) & other.protected_instance_methods(true)
|
102
|
+
c.empty ? false : c
|
108
103
|
end
|
109
104
|
|
110
|
-
|
105
|
+
end
|
@@ -1,16 +1,16 @@
|
|
1
1
|
class Proc
|
2
2
|
|
3
|
-
# CREDIT Dave
|
4
|
-
|
5
3
|
# Returns a new proc that is the functional
|
6
|
-
#
|
4
|
+
# composition of two procs, in order.
|
7
5
|
#
|
8
|
-
#
|
9
|
-
#
|
6
|
+
# a = lambda { |x| x + 4 }
|
7
|
+
# b = lambda { |y| y / 2 }
|
10
8
|
#
|
11
|
-
#
|
12
|
-
#
|
9
|
+
# a.compose(b).call(4) #=> 6
|
10
|
+
# b.compose(a).call(4) #=> 4
|
13
11
|
#
|
12
|
+
# CREDIT Dave
|
13
|
+
|
14
14
|
def compose(g)
|
15
15
|
raise ArgumentError, "arity count mismatch" unless arity == g.arity
|
16
16
|
lambda{ |*a| self[ *g[*a] ] }
|
@@ -18,12 +18,14 @@ class Proc
|
|
18
18
|
|
19
19
|
# Operator for Proc#compose and Integer#times_collect/of.
|
20
20
|
#
|
21
|
-
#
|
22
|
-
#
|
21
|
+
# a = lambda { |x| x + 4 }
|
22
|
+
# b = lambda { |y| y / 2 }
|
23
23
|
#
|
24
|
-
#
|
25
|
-
#
|
24
|
+
# (a * b).call(4) #=> 6
|
25
|
+
# (b * a).call(4) #=> 4
|
26
26
|
#
|
27
|
+
# CREDIT Dave
|
28
|
+
|
27
29
|
def *(x)
|
28
30
|
if Integer===x
|
29
31
|
# collect times
|
@@ -34,9 +36,10 @@ class Proc
|
|
34
36
|
end
|
35
37
|
end
|
36
38
|
|
39
|
+
# Use a Proc as an observable.
|
40
|
+
#
|
37
41
|
# CREDIT Tim Pease
|
38
42
|
|
39
|
-
# Use a Proc as an observable.
|
40
43
|
alias_method :update, :call
|
41
44
|
|
42
45
|
end
|