facets 1.8.0 → 1.8.8
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/PROJECT +4 -4
- data/Rakefile +19 -14
- data/VERSION +1 -1
- data/lib/facet/enumerable/cart.rb +1 -0
- data/lib/facet/enumerable/cartesian_product.rb +1 -0
- data/lib/facet/enumerable/self/cart.rb +1 -0
- data/lib/facet/enumerable/self/cartesian_product.rb +1 -0
- data/lib/facets.rb +2 -1
- data/lib/facets/core/dir/self/multiglob_sum.rb +2 -0
- data/lib/facets/core/enumerable/cart.rb +119 -0
- data/lib/facets/core/enumerable/cartesian_product.rb +8 -0
- data/lib/facets/core/enumerable/self/cart.rb +120 -0
- data/lib/facets/core/enumerable/self/cartesian_product.rb +8 -0
- data/lib/facets/core/string/singular.rb +7 -7
- data/lib/facets/more/ann.rb +6 -5
- data/lib/facets/more/ann_attr.rb +11 -14
- data/lib/facets/more/autovivify.rb +2 -2
- data/lib/facets/more/dictionary.rb +63 -69
- data/lib/facets/more/opencascade.rb +3 -3
- data/lib/facets/more/openobject.rb +318 -9
- data/lib/facets/more/times.rb +129 -43
- data/lib/facets/more/uploadutils.rb +248 -43
- data/work/hash_open.rb +23 -0
- data/work/openobject-temp.rb +45 -0
- metadata +13 -9
- data/lib/facet/enumerable/cross.rb +0 -1
- data/lib/facet/enumerable/self/cross.rb +0 -1
- data/lib/facet/openhash.rb +0 -1
- data/lib/facets/core/enumerable/cross.rb +0 -47
- data/lib/facets/core/enumerable/self/cross.rb +0 -85
- data/lib/facets/more/openhash.rb +0 -350
data/PROJECT
CHANGED
@@ -30,20 +30,20 @@ changelog: doc/HISTORY.txt
|
|
30
30
|
|
31
31
|
distribute: [ -doc/rdoc, -test/lib ]
|
32
32
|
|
33
|
-
package: [
|
33
|
+
package: [ gem, tgz ]
|
34
34
|
|
35
35
|
rdoc:
|
36
36
|
template : jamis
|
37
37
|
options : ['--all', '--inline-source']
|
38
38
|
|
39
39
|
mail:
|
40
|
-
|
41
|
-
|
40
|
+
mail_to : transfire@gmail.com #ruby-talk@ruby-lang.org
|
41
|
+
mail_from : transfire@gmail.com
|
42
42
|
domain : facets.rubyforge.org
|
43
43
|
server : smtp.gmail.com
|
44
44
|
port : 25 #587
|
45
45
|
account : transfire@gmail.com
|
46
|
-
|
46
|
+
login_type : login #cram_md5 #plain
|
47
47
|
secure : true
|
48
48
|
|
49
49
|
announce_memo : 'doc/LATEST'
|
data/Rakefile
CHANGED
@@ -1,15 +1,18 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
#
|
4
|
-
|
5
|
-
require '
|
6
|
-
|
2
|
+
|
3
|
+
# Facets Rakefile
|
4
|
+
|
5
|
+
require '4rake/4rake'
|
6
|
+
|
7
|
+
|
8
|
+
#require 'project/project'
|
9
|
+
#project = Project.load
|
7
10
|
|
8
11
|
#
|
9
12
|
# Redirect, extact tests and run tests
|
10
13
|
#
|
11
14
|
|
12
|
-
task :prepare => [ :redirect, :extest, :test ]
|
15
|
+
#task :prepare => [ :redirect, :extest, :test ]
|
13
16
|
|
14
17
|
#
|
15
18
|
# Generate facet/ redirection files
|
@@ -47,20 +50,21 @@ end
|
|
47
50
|
# Extract tests
|
48
51
|
#
|
49
52
|
|
50
|
-
desc "ectract units tests"
|
51
|
-
task :extest do
|
52
|
-
project.extract(:files=>'lib/facets/**/*.rb')
|
53
|
-
end
|
53
|
+
#desc "ectract units tests"
|
54
|
+
#task :extest do
|
55
|
+
# project.extract(:files=>'lib/facets/**/*.rb')
|
56
|
+
#end
|
54
57
|
|
55
58
|
#
|
56
59
|
# Run tests
|
57
60
|
#
|
58
61
|
|
59
|
-
desc "run tests"
|
60
|
-
task :test do
|
61
|
-
project.test
|
62
|
-
end
|
62
|
+
#desc "run tests"
|
63
|
+
#task :test do
|
64
|
+
# project.test
|
65
|
+
#end
|
63
66
|
|
67
|
+
=begin
|
64
68
|
#
|
65
69
|
# Generate API documentation
|
66
70
|
#
|
@@ -92,6 +96,7 @@ task :rdoc_more do
|
|
92
96
|
output: doc/rdoc/more
|
93
97
|
END
|
94
98
|
end
|
99
|
+
=end
|
95
100
|
|
96
101
|
#
|
97
102
|
# List core methods
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.8.
|
1
|
+
1.8.8 rc (2007-01-30)
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'facets/core/enumerable/cart.rb'
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'facets/core/enumerable/cartesian_product.rb'
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'facets/core/enumerable/self/cart.rb'
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'facets/core/enumerable/self/cartesian_product.rb'
|
data/lib/facets.rb
CHANGED
@@ -67,7 +67,8 @@ require 'facets/core/time/to_time'
|
|
67
67
|
require 'facets/core/module/is'
|
68
68
|
require 'facets/core/kernel/fn'
|
69
69
|
require 'facets/core/kernel/here'
|
70
|
-
|
70
|
+
# TODO need a singleton method !!!
|
71
|
+
#require 'facets/core/kernel/own' # better name?
|
71
72
|
|
72
73
|
# Convenience
|
73
74
|
require 'facets/core/array/to_h'
|
@@ -0,0 +1,119 @@
|
|
1
|
+
#--
|
2
|
+
# Cross product adapted from code by Michael Neuman.
|
3
|
+
#++
|
4
|
+
|
5
|
+
require 'generator'
|
6
|
+
|
7
|
+
module Enumerable
|
8
|
+
|
9
|
+
class << self
|
10
|
+
|
11
|
+
# Provides the cross-product of two or more Enumerables.
|
12
|
+
# This is the class-level method. The instance method
|
13
|
+
# calls on this.
|
14
|
+
#
|
15
|
+
# Enumerable.cross([1,2], [4], ["apple", "banana"])
|
16
|
+
# #=> [[1, 4, "apple"], [1, 4, "banana"], [2, 4, "apple"], [2, 4, "banana"]]
|
17
|
+
#
|
18
|
+
# Enumerable.cross([1,2], [3,4])
|
19
|
+
# #=> [[1, 3], [1, 4], [2, 3], [2, 4]]
|
20
|
+
#
|
21
|
+
#--
|
22
|
+
# TODO Make a more efficient version just for Array (?)
|
23
|
+
#++
|
24
|
+
|
25
|
+
def cartesian_product(*enums, &block)
|
26
|
+
raise if enums.empty?
|
27
|
+
gens = enums.map{|e| Generator.new(e)}
|
28
|
+
return [] if gens.any? {|g| g.end?}
|
29
|
+
|
30
|
+
sz = gens.size
|
31
|
+
res = []
|
32
|
+
tuple = Array.new(sz)
|
33
|
+
|
34
|
+
loop do
|
35
|
+
# fill tuple
|
36
|
+
(0 ... sz).each { |i|
|
37
|
+
tuple[i] = gens[i].current
|
38
|
+
}
|
39
|
+
if block.nil?
|
40
|
+
res << tuple.dup
|
41
|
+
else
|
42
|
+
block.call(tuple.dup)
|
43
|
+
end
|
44
|
+
|
45
|
+
# step forward
|
46
|
+
gens[-1].next
|
47
|
+
(sz-1).downto(0) do |i|
|
48
|
+
if gens[i].end?
|
49
|
+
if i > 0
|
50
|
+
gens[i].rewind
|
51
|
+
gens[i-1].next
|
52
|
+
else
|
53
|
+
return res
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end #loop
|
58
|
+
end
|
59
|
+
|
60
|
+
alias :cart, :cartesian_product
|
61
|
+
end
|
62
|
+
|
63
|
+
|
64
|
+
# The instance level version of <tt>Enumerable::cartesian_product</tt>.
|
65
|
+
#
|
66
|
+
# a = []
|
67
|
+
# [1,2].cart([4,5]){|elem| a << elem }
|
68
|
+
# a #=> [[1, 4],[1, 5],[2, 4],[2, 5]]
|
69
|
+
#
|
70
|
+
#--
|
71
|
+
# TODO Make a more efficient version just for Array (?)
|
72
|
+
#++
|
73
|
+
|
74
|
+
def cart(*enums, &block)
|
75
|
+
Enumerable.cart(self, *enums, &block)
|
76
|
+
end
|
77
|
+
|
78
|
+
alias :cart, :cartesian_product
|
79
|
+
end
|
80
|
+
|
81
|
+
|
82
|
+
|
83
|
+
# _____ _
|
84
|
+
# |_ _|__ ___| |_
|
85
|
+
# | |/ _ \/ __| __|
|
86
|
+
# | | __/\__ \ |_
|
87
|
+
# |_|\___||___/\__|
|
88
|
+
#
|
89
|
+
=begin test
|
90
|
+
|
91
|
+
require 'test/unit'
|
92
|
+
|
93
|
+
class TCEnumerableClass < Test::Unit::TestCase
|
94
|
+
|
95
|
+
def test_cross
|
96
|
+
i = [[1,2], [3,4]]
|
97
|
+
o = [[1, 3], [1, 4], [2, 3], [2, 4]]
|
98
|
+
assert_equal( o, Enumerable.cart(*i) )
|
99
|
+
i = [[1,2], [4], ["apple", "banana"]]
|
100
|
+
o = [[1, 4, "apple"], [1, 4, "banana"], [2, 4, "apple"], [2, 4, "banana"]]
|
101
|
+
assert_equal( o, Enumerable.cart(*i) )
|
102
|
+
end
|
103
|
+
|
104
|
+
end
|
105
|
+
|
106
|
+
|
107
|
+
class TCEnumerable < Test::Unit::TestCase
|
108
|
+
|
109
|
+
def test_cross
|
110
|
+
a = [1,2,3].cart([4,5,6])
|
111
|
+
assert_equal( [[1, 4],[1, 5],[1, 6],[2, 4],[2, 5],[2, 6],[3, 4],[3, 5],[3, 6]], a )
|
112
|
+
a = []
|
113
|
+
[1,2,3].cart([4,5,6]) {|elem| a << elem }
|
114
|
+
assert_equal( [[1, 4],[1, 5],[1, 6],[2, 4],[2, 5],[2, 6],[3, 4],[3, 5],[3, 6]], a )
|
115
|
+
end
|
116
|
+
|
117
|
+
end
|
118
|
+
|
119
|
+
=end
|
@@ -0,0 +1,120 @@
|
|
1
|
+
# CREDIT Michael Neuman#
|
2
|
+
# CREDIT Thomas Halfner (name correction from cross.rb)
|
3
|
+
#
|
4
|
+
# Cross product adapted from code by Michael Neuman.
|
5
|
+
|
6
|
+
require 'generator'
|
7
|
+
|
8
|
+
module Enumerable
|
9
|
+
|
10
|
+
class << self
|
11
|
+
|
12
|
+
# Provides the cross-product of two or more Enumerables.
|
13
|
+
# This is the class-level method. The instance method
|
14
|
+
# calls on this.
|
15
|
+
#
|
16
|
+
# Enumerable.cross([1,2], [4], ["apple", "banana"])
|
17
|
+
# #=> [[1, 4, "apple"], [1, 4, "banana"], [2, 4, "apple"], [2, 4, "banana"]]
|
18
|
+
#
|
19
|
+
# Enumerable.cross([1,2], [3,4])
|
20
|
+
# #=> [[1, 3], [1, 4], [2, 3], [2, 4]]
|
21
|
+
#
|
22
|
+
#--
|
23
|
+
# TODO Make a more efficient version just for Array (?)
|
24
|
+
#++
|
25
|
+
|
26
|
+
def cartesian_product(*enums, &block)
|
27
|
+
raise if enums.empty?
|
28
|
+
gens = enums.map{|e| Generator.new(e)}
|
29
|
+
return [] if gens.any? {|g| g.end?}
|
30
|
+
|
31
|
+
sz = gens.size
|
32
|
+
res = []
|
33
|
+
tuple = Array.new(sz)
|
34
|
+
|
35
|
+
loop do
|
36
|
+
# fill tuple
|
37
|
+
(0 ... sz).each { |i|
|
38
|
+
tuple[i] = gens[i].current
|
39
|
+
}
|
40
|
+
if block.nil?
|
41
|
+
res << tuple.dup
|
42
|
+
else
|
43
|
+
block.call(tuple.dup)
|
44
|
+
end
|
45
|
+
|
46
|
+
# step forward
|
47
|
+
gens[-1].next
|
48
|
+
(sz-1).downto(0) do |i|
|
49
|
+
if gens[i].end?
|
50
|
+
if i > 0
|
51
|
+
gens[i].rewind
|
52
|
+
gens[i-1].next
|
53
|
+
else
|
54
|
+
return res
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end #loop
|
59
|
+
end
|
60
|
+
|
61
|
+
alias :cart, :cartesian_product
|
62
|
+
end
|
63
|
+
|
64
|
+
|
65
|
+
# The instance level version of <tt>Enumerable::cartesian_product</tt>.
|
66
|
+
#
|
67
|
+
# a = []
|
68
|
+
# [1,2].cart([4,5]){|elem| a << elem }
|
69
|
+
# a #=> [[1, 4],[1, 5],[2, 4],[2, 5]]
|
70
|
+
#
|
71
|
+
#--
|
72
|
+
# TODO Make a more efficient version just for Array (?)
|
73
|
+
#++
|
74
|
+
|
75
|
+
def cart(*enums, &block)
|
76
|
+
Enumerable.cart(self, *enums, &block)
|
77
|
+
end
|
78
|
+
|
79
|
+
alias :cart, :cartesian_product
|
80
|
+
end
|
81
|
+
|
82
|
+
|
83
|
+
|
84
|
+
# _____ _
|
85
|
+
# |_ _|__ ___| |_
|
86
|
+
# | |/ _ \/ __| __|
|
87
|
+
# | | __/\__ \ |_
|
88
|
+
# |_|\___||___/\__|
|
89
|
+
#
|
90
|
+
=begin test
|
91
|
+
|
92
|
+
require 'test/unit'
|
93
|
+
|
94
|
+
class TCEnumerableClass < Test::Unit::TestCase
|
95
|
+
|
96
|
+
def test_cross
|
97
|
+
i = [[1,2], [3,4]]
|
98
|
+
o = [[1, 3], [1, 4], [2, 3], [2, 4]]
|
99
|
+
assert_equal( o, Enumerable.cart(*i) )
|
100
|
+
i = [[1,2], [4], ["apple", "banana"]]
|
101
|
+
o = [[1, 4, "apple"], [1, 4, "banana"], [2, 4, "apple"], [2, 4, "banana"]]
|
102
|
+
assert_equal( o, Enumerable.cart(*i) )
|
103
|
+
end
|
104
|
+
|
105
|
+
end
|
106
|
+
|
107
|
+
|
108
|
+
class TCEnumerable < Test::Unit::TestCase
|
109
|
+
|
110
|
+
def test_cross
|
111
|
+
a = [1,2,3].cart([4,5,6])
|
112
|
+
assert_equal( [[1, 4],[1, 5],[1, 6],[2, 4],[2, 5],[2, 6],[3, 4],[3, 5],[3, 6]], a )
|
113
|
+
a = []
|
114
|
+
[1,2,3].cart([4,5,6]) {|elem| a << elem }
|
115
|
+
assert_equal( [[1, 4],[1, 5],[1, 6],[2, 4],[2, 5],[2, 6],[3, 4],[3, 5],[3, 6]], a )
|
116
|
+
end
|
117
|
+
|
118
|
+
end
|
119
|
+
|
120
|
+
=end
|
@@ -53,7 +53,7 @@ class String
|
|
53
53
|
inflection_rule 'ch' , '' , 'es' # search, switch
|
54
54
|
inflection_rule 'ss' , '' , 'es' # process, address
|
55
55
|
inflection_rule 'sh' , '' , 'es' # dish, wish
|
56
|
-
inflection_rule 'qu' , 'y' , 'ies' # query, ability, agency
|
56
|
+
#inflection_rule 'qu' , 'y' , 'ies' # query, ability, agency
|
57
57
|
inflection_rule 'hive' , '' , 's' # archive, hive
|
58
58
|
inflection_rule 'sis' , '' , 'ses' # basis, diagnosis
|
59
59
|
inflection_rule 't' , 'um' , 'a' # datum, medium, forum
|
@@ -75,12 +75,12 @@ class String
|
|
75
75
|
inflection_rule 'test' , 'is' , 'es' # testis
|
76
76
|
inflection_rule 'l' , 'f' , 'ves' # half halves
|
77
77
|
inflection_rule '' , 'fe' , 'ves' # safe, wife
|
78
|
-
inflection_rule 'a' , 'y' , '
|
79
|
-
inflection_rule 'e' , 'y' , '
|
80
|
-
inflection_rule 'i' , 'y' , '
|
81
|
-
inflection_rule 'o' , 'y' , '
|
82
|
-
inflection_rule 'u' , 'y' , '
|
83
|
-
inflection_rule '' , 'y' , 'ies' #
|
78
|
+
inflection_rule 'a' , 'y' , 'ys' # TODO Combine as a|e|i|o|u
|
79
|
+
inflection_rule 'e' , 'y' , 'ys' #
|
80
|
+
inflection_rule 'i' , 'y' , 'ys' #
|
81
|
+
inflection_rule 'o' , 'y' , 'ys' #
|
82
|
+
inflection_rule 'u' , 'y' , 'ys' #
|
83
|
+
inflection_rule '' , 'y' , 'ies' #
|
84
84
|
inflection_rule '' , '' , 's' # --catch all--
|
85
85
|
|
86
86
|
# Convert an English word from plurel to singular.
|
data/lib/facets/more/ann.rb
CHANGED
@@ -21,7 +21,7 @@
|
|
21
21
|
# method defined, like how +desc+ annotates a rake +task+.
|
22
22
|
#
|
23
23
|
# TODO The ann(x).name notation is kind of nice. Would like to add that
|
24
|
-
# back-in if reasonable. Basically this require heritage to be an
|
24
|
+
# back-in if reasonable. Basically this require heritage to be an OpenObject
|
25
25
|
# rather than just a hash.
|
26
26
|
#
|
27
27
|
# == Authors & Contributors
|
@@ -33,7 +33,7 @@
|
|
33
33
|
# License:: Ruby License
|
34
34
|
|
35
35
|
require 'facets/core/hash/to_h'
|
36
|
-
require 'facets/core/hash/
|
36
|
+
require 'facets/core/hash/rekey'
|
37
37
|
require 'facets/core/hash/op_add'
|
38
38
|
|
39
39
|
# = Annotation
|
@@ -106,7 +106,7 @@ class Module
|
|
106
106
|
if Hash === keys
|
107
107
|
ref = ref.to_sym
|
108
108
|
annotations[ref] ||= {}
|
109
|
-
annotations[ref].update(keys.
|
109
|
+
annotations[ref].update(keys.rekey)
|
110
110
|
else
|
111
111
|
key = keys.to_sym
|
112
112
|
heritage(ref)[key]
|
@@ -118,7 +118,8 @@ class Module
|
|
118
118
|
# in the class or module's ancestors.
|
119
119
|
|
120
120
|
def ann!( ref, keys_or_class=nil, keys=nil )
|
121
|
-
return heritage(ref) unless keys_or_class or keys
|
121
|
+
#return heritage(ref) unless keys_or_class or keys
|
122
|
+
return annotations[ref] unless keys_or_class or keys
|
122
123
|
|
123
124
|
if Class === keys_or_class
|
124
125
|
keys ||= {}
|
@@ -130,7 +131,7 @@ class Module
|
|
130
131
|
if Hash === keys
|
131
132
|
ref = ref.to_sym
|
132
133
|
annotations[ref] ||= {}
|
133
|
-
annotations[ref].update(keys.
|
134
|
+
annotations[ref].update(keys.rekey)
|
134
135
|
else
|
135
136
|
key = keys.to_sym
|
136
137
|
annotations[ref][key] = heritage(ref)[key].dup
|