facets 2.2.1 → 2.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +6 -0
- data/NOTES +14 -1
- data/Rakefile +26 -0
- data/demo/bench/general/bench_calls.rb +74 -0
- data/demo/bench/general/bench_includes.rb +25 -0
- data/demo/bench/general/bench_methods.rb +17 -0
- data/demo/bench/general/bench_pathname.rb +24 -0
- data/demo/bench/general/bench_range.rb +64 -0
- data/demo/bench/general/bench_return.rb +56 -0
- data/demo/bench/general/bench_yeild.rb +75 -0
- data/lib/{more → class}/facets/association.rb +0 -0
- data/lib/{more → class}/facets/autoarray.rb +0 -0
- data/lib/{more → class}/facets/basicobject.rb +0 -0
- data/lib/{more → class}/facets/buildingblock.rb +0 -44
- data/lib/{more → class}/facets/cachedelegator.rb +3 -0
- data/lib/{more → class}/facets/coroutine.rb +0 -56
- data/lib/{more → class}/facets/dictionary.rb +0 -0
- data/lib/{more → class}/facets/downloader.rb +0 -0
- data/lib/{more → class}/facets/filelist.rb +0 -0
- data/lib/{more → class}/facets/fileshell.rb +0 -0
- data/lib/{more → class}/facets/hashbuilder.rb +0 -0
- data/lib/{more → class}/facets/heap.rb +0 -0
- data/lib/{more → class}/facets/infinity.rb +0 -46
- data/lib/{more → class}/facets/interval.rb +0 -0
- data/lib/{more → class}/facets/ioredirect.rb +0 -0
- data/lib/{more → class}/facets/linkedlist.rb +0 -42
- data/lib/{more → class}/facets/lrucache.rb +0 -23
- data/lib/{more → class}/facets/minitar.rb +0 -0
- data/lib/{more → class}/facets/nackclass.rb +0 -0
- data/lib/{more → class}/facets/nullclass.rb +0 -0
- data/lib/{more → class}/facets/opencascade.rb +0 -70
- data/lib/{more → class}/facets/opencollection.rb +0 -0
- data/lib/class/facets/openhash.rb +41 -0
- data/lib/{more → class}/facets/openobject.rb +0 -121
- data/lib/{more → class}/facets/orderedhash.rb +0 -0
- data/lib/{more → class}/facets/pathlist.rb +0 -0
- data/lib/{more → class}/facets/pool.rb +0 -0
- data/lib/{more → class}/facets/pqueue.rb +0 -0
- data/lib/{more → class}/facets/progressbar.rb +0 -0
- data/lib/{more → class}/facets/recorder.rb +0 -40
- data/lib/{more → class}/facets/reference.rb +0 -0
- data/lib/{more → class}/facets/rwdelegator.rb +0 -0
- data/lib/{more → class}/facets/semaphore.rb +0 -0
- data/lib/{more → class}/facets/syncarray.rb +0 -24
- data/lib/{more → class}/facets/synchash.rb +1 -25
- data/lib/{more → class}/facets/timer.rb +0 -62
- data/lib/{more → class}/facets/tuple.rb +0 -60
- data/lib/{more → class}/facets/version.rb +0 -0
- data/lib/core/facets/dir/multiglob.rb +20 -5
- data/lib/core/facets/enumerable/cartesian.rb +2 -2
- data/lib/core/facets/enumerable/combination.rb +9 -1
- data/lib/core/facets/kernel/object.rb +1 -1
- data/lib/{more → mixin}/facets/binreadable.rb +0 -62
- data/lib/{more → mixin}/facets/buildable.rb +0 -48
- data/lib/mixin/facets/cloneable.rb +90 -0
- data/lib/{more → mixin}/facets/enumerablepass.rb +0 -81
- data/lib/{more → mixin}/facets/expirable.rb +0 -0
- data/lib/{more → mixin}/facets/fileable.rb +0 -0
- data/lib/{more → mixin}/facets/instantiable.rb +0 -30
- data/lib/{more → mixin}/facets/multiton.rb +0 -0
- data/lib/{more → mixin}/facets/registerable.rb +0 -0
- data/lib/mixin/facets/tasksystem.rb +350 -0
- data/lib/{more → mixin}/facets/uninheritable.rb +1 -39
- data/lib/{more → mixin}/facets/validation.rb +0 -0
- data/lib/more/facets/arguments.rb +0 -66
- data/lib/more/facets/attributes.rb +0 -35
- data/lib/more/facets/bbcode.rb +1 -31
- data/lib/more/facets/bytes.rb +0 -80
- data/lib/more/facets/class_extension.rb +0 -66
- data/lib/more/facets/classmethods.rb +0 -64
- data/lib/more/facets/compare_on.rb +0 -52
- data/lib/more/facets/curry.rb +0 -29
- data/lib/more/facets/cut.rb +0 -27
- data/lib/more/facets/date.rb +0 -54
- data/lib/more/facets/dependency.rb +0 -70
- data/lib/more/facets/elementor.rb +0 -67
- data/lib/more/facets/getoptlong.rb +0 -30
- data/lib/more/facets/{hash_keyize.rb → hash/keyize.rb} +0 -0
- data/lib/more/facets/inheritor.rb +0 -150
- data/lib/more/facets/instantise.rb +0 -41
- data/lib/more/facets/let.rb +0 -20
- data/lib/more/facets/memoize.rb +0 -45
- data/lib/more/facets/multipliers.rb +0 -110
- data/lib/more/facets/ostruct.rb +0 -124
- data/lib/more/facets/random.rb +0 -153
- data/lib/more/facets/rbconfig.rb +55 -0
- data/lib/more/facets/set.rb +27 -0
- data/lib/more/facets/snapshot.rb +0 -30
- data/lib/more/facets/stylize.rb +0 -147
- data/lib/more/facets/times.rb +0 -98
- data/lib/more/facets/tracepoint.rb +194 -0
- data/lib/more/facets/typecast.rb +0 -63
- data/lib/more/facets/ziputils.rb +7 -0
- data/log/Changelog-0.txt +239 -0
- data/log/Changelog-1.txt +450 -0
- data/log/Changelog.txt +841 -0
- data/log/Fixme.txt +18 -0
- data/log/Testlog.txt +188 -0
- data/log/Todo.txt +326 -0
- data/meta/MANIFEST +1 -1
- data/meta/VERSION +1 -0
- data/meta/authors +48 -0
- data/meta/description +8 -0
- data/meta/project.yaml +11 -5
- data/task/install +4 -2
- data/task/rdoc +5 -0
- data/task/test +40 -0
- data/test/{unit → class}/test_association.rb +0 -0
- data/test/{unit → class}/test_autoarray.rb +0 -0
- data/test/{unit → class}/test_basicobject.rb +0 -0
- data/test/{unit → class}/test_buildingblock.rb +1 -0
- data/test/{unit → class}/test_coroutine.rb +0 -0
- data/test/{unit → class}/test_dictionary.rb +0 -0
- data/test/{unit → class}/test_infinity.rb +0 -0
- data/test/{unit → class}/test_interval.rb +0 -0
- data/test/{unit → class}/test_linkedlist.rb +1 -1
- data/test/{unit → class}/test_lrucache.rb +3 -0
- data/test/{unit → class}/test_opencascade.rb +0 -0
- data/test/{unit → class}/test_openobject.rb +0 -0
- data/test/{unit → class}/test_recorder.rb +0 -1
- data/test/{unit → class}/test_syncarray.rb +2 -4
- data/test/{unit → class}/test_synchash.rb +2 -4
- data/test/{unit → class}/test_timer.rb +0 -1
- data/test/{unit → class}/test_tuple.rb +0 -0
- data/test/{unit → core}/array/test_delete.rb +0 -0
- data/test/{unit → core}/array/test_indexable.rb +0 -0
- data/test/{unit → core}/array/test_merge.rb +0 -0
- data/test/{unit → core}/array/test_only.rb +0 -0
- data/test/{unit → core}/array/test_pad.rb +0 -0
- data/test/{unit → core}/array/test_rotate.rb +0 -0
- data/test/{unit → core}/array/test_select.rb +0 -0
- data/test/{unit → core}/array/test_stackable.rb +0 -0
- data/test/{unit/binding/test_cflow.rb → core/binding/test_caller.rb} +2 -2
- data/test/{unit → core}/binding/test_defined.rb +0 -0
- data/test/{unit → core}/binding/test_eval.rb +0 -0
- data/test/{unit → core}/binding/test_here.rb +0 -0
- data/test/{unit → core}/binding/test_self.rb +0 -0
- data/test/{unit → core}/binding/test_vars.rb +0 -0
- data/test/{unit → core}/class/test_descendents.rb +0 -0
- data/test/{unit → core}/class/test_initializer.rb +0 -0
- data/test/{unit → core}/class/test_remove_descendents.rb +0 -0
- data/test/{unit → core}/comparable/test_bound.rb +0 -0
- data/test/{unit → core}/comparable/test_cmp.rb +0 -0
- data/test/{unit → core}/dir/test_parent.rb +0 -0
- data/test/{unit → core}/dir/test_recurse.rb +0 -0
- data/test/{unit → core}/dir/test_traverse.rb +0 -0
- data/test/{unit → core}/enumerable/test_cartesian.rb +0 -0
- data/test/{unit → core}/enumerable/test_collect.rb +0 -0
- data/test/{unit → core}/enumerable/test_combination.rb +0 -0
- data/test/{unit → core}/enumerable/test_count.rb +0 -0
- data/test/{unit → core}/enumerable/test_each.rb +0 -0
- data/test/{unit → core}/enumerable/test_mash.rb +0 -0
- data/test/{unit → core}/enumerable/test_permutation.rb +0 -0
- data/test/{unit → core}/enumerable/test_probability.rb +0 -0
- data/test/{unit → core}/enumerable/test_split.rb +0 -0
- data/test/{unit → core}/exception/test_detail.rb +0 -0
- data/test/{unit → core}/file/test_null.rb +0 -0
- data/test/{unit → core}/file/test_read.rb +0 -0
- data/test/{unit → core}/file/test_sanitize.rb +0 -0
- data/test/{unit → core}/file/test_split_all.rb +0 -0
- data/test/{unit → core}/file/test_write.rb +0 -0
- data/test/{unit → core}/filetest/test_root.rb +0 -0
- data/test/{unit → core}/hash/test_alias.rb +0 -0
- data/test/{unit → core}/hash/test_at.rb +0 -0
- data/test/{unit → core}/hash/test_autonew.rb +0 -0
- data/test/core/hash/test_collate.rb +33 -0
- data/test/{unit → core}/hash/test_delete.rb +0 -0
- data/test/{unit → core}/hash/test_each_with_key.rb +0 -0
- data/test/{unit → core}/hash/test_has_keys.rb +0 -0
- data/test/{unit → core}/hash/test_insert.rb +0 -0
- data/test/{unit → core}/hash/test_inverse.rb +0 -0
- data/test/{unit → core}/hash/test_op.rb +0 -0
- data/test/{unit → core}/hash/test_rekey.rb +0 -0
- data/test/{unit → core}/hash/test_reverse_merge.rb +0 -0
- data/test/{unit → core}/hash/test_select.rb +0 -0
- data/test/{unit → core}/hash/test_swap.rb +0 -0
- data/test/{unit → core}/hash/test_traverse.rb +0 -0
- data/test/{unit → core}/hash/test_update.rb +0 -0
- data/test/{unit → core}/hash/test_weave.rb +0 -0
- data/test/{unit → core}/hash/test_zipnew.rb +0 -0
- data/test/{unit → core}/integer/test_bitmask.rb +0 -0
- data/test/{unit → core}/integer/test_factorial.rb +0 -0
- data/test/{unit → core}/integer/test_multiple.rb +0 -0
- data/test/{unit → core}/integer/test_of.rb +0 -0
- data/test/{unit → core}/kernel/test_callstack.rb +0 -0
- data/test/{unit → core}/kernel/test_constant.rb +0 -0
- data/test/{unit → core}/kernel/test_deepcopy.rb +0 -0
- data/test/{unit → core}/kernel/test_instance.rb +0 -0
- data/test/{unit → core}/kernel/test_metaid.rb +0 -0
- data/test/{unit → core}/kernel/test_object.rb +1 -1
- data/test/{unit → core}/kernel/test_populate.rb +0 -0
- data/test/{unit → core}/kernel/test_report.rb +0 -0
- data/test/{unit → core}/kernel/test_returning.rb +0 -0
- data/test/{unit → core}/kernel/test_silence.rb +0 -0
- data/test/{unit → core}/kernel/test_super.rb +0 -0
- data/test/{unit → core}/kernel/test_tap.rb +0 -0
- data/test/{unit → core}/kernel/test_val.rb +0 -0
- data/test/{unit → core}/kernel/test_withattr.rb +0 -0
- data/test/{unit → core}/matchdata/test_match.rb +0 -0
- data/test/{unit → core}/matchdata/test_matchset.rb +0 -0
- data/test/{unit → core}/module/test_abstract.rb +0 -0
- data/test/{unit → core}/module/test_alias.rb +0 -0
- data/test/{unit → core}/module/test_cattr.rb +0 -0
- data/test/{unit → core}/module/test_clone.rb +0 -0
- data/test/{unit → core}/module/test_include.rb +0 -0
- data/test/{unit → core}/module/test_modify.rb +0 -0
- data/test/{unit → core}/module/test_name.rb +0 -0
- data/test/{unit → core}/module/test_traits.rb +0 -0
- data/test/{unit → core}/numeric/test_round.rb +0 -0
- data/test/{unit → core}/proc/test_bind.rb +0 -0
- data/test/{unit → core}/proc/test_compose.rb +0 -0
- data/test/{unit → core}/range/test_combine.rb +0 -0
- data/test/{unit → core}/range/test_overlap.rb +0 -0
- data/test/{unit → core}/regexp/test_arity.rb +0 -0
- data/test/{unit → core}/string/test_align.rb +0 -0
- data/test/{unit → core}/string/test_blank.rb +0 -0
- data/test/{unit → core}/string/test_bracket.rb +0 -0
- data/test/{unit → core}/string/test_case.rb +0 -0
- data/test/{unit → core}/string/test_crypt.rb +0 -0
- data/test/{unit → core}/string/test_filter.rb +0 -0
- data/test/{unit → core}/string/test_indexable.rb +0 -0
- data/test/{unit → core}/string/test_interpolate.rb +0 -0
- data/test/{unit → core}/string/test_natcmp.rb +0 -0
- data/test/{unit → core}/string/test_nchar.rb +0 -0
- data/test/{unit → core}/string/test_op.rb +0 -0
- data/test/{unit → core}/string/test_partitions.rb +0 -0
- data/test/{unit → core}/string/test_range.rb +0 -0
- data/test/{unit → core}/string/test_regesc.rb +0 -0
- data/test/{unit → core}/string/test_scan.rb +0 -0
- data/test/{unit → core}/string/test_stackable.rb +0 -0
- data/test/{unit → core}/string/test_tabs.rb +0 -0
- data/test/{unit → core}/string/test_wrap.rb +0 -0
- data/test/{unit → core}/symbol/test_chomp.rb +0 -0
- data/test/{unit → core}/symbol/test_generate.rb +0 -0
- data/test/{unit → core}/symbol/test_not.rb +0 -0
- data/test/{unit → core}/symbol/test_shadow.rb +0 -0
- data/test/{unit → core}/symbol/test_succ.rb +0 -0
- data/test/{unit → core}/symbol/test_to_proc.rb +0 -0
- data/test/{unit → core}/test_1stclassmethod.rb +0 -0
- data/test/{unit → core}/test_boolean.rb +0 -0
- data/test/{unit → core}/test_conversion.rb +0 -0
- data/test/{unit → core}/test_functor.rb +0 -0
- data/test/{unit → core}/time/test_change.rb +0 -0
- data/test/{unit → core}/time/test_elapse.rb +0 -0
- data/test/{unit → core}/time/test_stamp.rb +0 -0
- data/test/{unit → mixin}/test_binreadable.rb +0 -0
- data/test/{unit → mixin}/test_buildable.rb +1 -0
- data/test/mixin/test_cloneable.rb +41 -0
- data/test/{unit → mixin}/test_enumerablepass.rb +0 -0
- data/test/{unit → mixin}/test_instantiable.rb +2 -1
- data/test/{unit → mixin}/test_multiton.rb +0 -0
- data/test/{unit → mixin}/test_uninheritable.rb +1 -2
- data/test/{unit → more/hash}/test_keyize.rb +1 -1
- data/test/{unit → more}/test_advice.rb +0 -0
- data/test/{unit → more}/test_annotations.rb +0 -0
- data/test/{unit → more}/test_ansicode.rb +0 -0
- data/test/{unit → more}/test_aop.rb +0 -0
- data/test/{unit → more}/test_arguments.rb +1 -0
- data/test/{unit → more}/test_attributes.rb +2 -2
- data/test/{unit → more}/test_bbcode.rb +1 -0
- data/test/{unit → more}/test_bytes.rb +1 -0
- data/test/{unit → more}/test_class_extension.rb +2 -1
- data/test/{unit → more}/test_classmethods.rb +2 -1
- data/test/{unit → more}/test_compare_on.rb +0 -1
- data/test/{unit → more}/test_continuation.rb +0 -0
- data/test/{unit → more}/test_crypt.rb +0 -0
- data/test/{unit → more}/test_curry.rb +1 -0
- data/test/{unit → more}/test_cut.rb +2 -1
- data/test/{unit → more}/test_date.rb +1 -1
- data/test/{unit → more}/test_dependency.rb +2 -2
- data/test/{unit → more}/test_elementor.rb +1 -1
- data/test/{unit → more}/test_getoptlong.rb +1 -0
- data/test/{unit → more}/test_inheritor.rb +1 -1
- data/test/{unit → more}/test_instantise.rb +2 -1
- data/test/{unit → more}/test_interface.rb +0 -0
- data/test/{unit → more}/test_let.rb +0 -1
- data/test/{unit → more}/test_memoize.rb +2 -3
- data/test/{unit → more}/test_multipliers.rb +1 -1
- data/test/{unit → more}/test_namespace.rb +0 -0
- data/test/{unit → more}/test_ostruct.rb +0 -0
- data/test/{unit → more}/test_overload.rb +0 -0
- data/test/{unit → more}/test_paramix.rb +0 -0
- data/test/{unit → more}/test_prototype.rb +0 -0
- data/test/more/test_random.rb +146 -0
- data/test/{unit → more}/test_snapshot.rb +0 -3
- data/test/{unit → more}/test_stylize.rb +1 -2
- data/test/{unit → more}/test_thread.rb +0 -0
- data/test/{unit → more}/test_times.rb +2 -2
- data/test/{unit → more}/test_typecast.rb +0 -3
- metadata +1117 -1098
- data/lib/more/facets/cloneable.rb +0 -75
- data/log/changelog.txt +0 -0
- data/meta/facets.roll +0 -4
- data/meta/google_ad.html +0 -15
- data/meta/icli.yaml +0 -17
- data/task/changes +0 -29
- data/task/clean +0 -17
- data/task/clobber/package +0 -10
- data/task/log +0 -17
- data/task/prepare +0 -7
- data/task/publish +0 -43
- data/task/release +0 -10
- data/task/stamp +0 -33
- data/task/stats +0 -138
- data/task/test/cross +0 -309
- data/task/test/each +0 -42
- data/task/test/load +0 -30
- data/task/test/pairs +0 -50
- data/task/test/solo +0 -294
- data/task/test/syntax +0 -31
- data/task/test/whole +0 -34
- data/test/unit/hash/test_collate.rb +0 -31
- data/test/unit/test_random.rb +0 -149
@@ -0,0 +1,90 @@
|
|
1
|
+
# TITLE:
|
2
|
+
#
|
3
|
+
# Clonable
|
4
|
+
#
|
5
|
+
# SUMMARY:
|
6
|
+
#
|
7
|
+
# Standard basis for adding deep #dup and #clone to a class.
|
8
|
+
#
|
9
|
+
# COPYRIGHT:
|
10
|
+
#
|
11
|
+
# Copyright (c) 2002 Jim Weirich
|
12
|
+
#
|
13
|
+
# LICENSE:
|
14
|
+
#
|
15
|
+
# GNU General Public License (GPL)
|
16
|
+
#
|
17
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
18
|
+
# a copy of this software and associated documentation files (the
|
19
|
+
# "Software"), to deal in the Software without restriction, including
|
20
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
21
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
22
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
23
|
+
# the following conditions:
|
24
|
+
#
|
25
|
+
# The above copyright notice and this permission notice shall be
|
26
|
+
# included in all copies or substantial portions of the Software.
|
27
|
+
#
|
28
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
29
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
30
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
31
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
32
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
33
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
34
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
35
|
+
#
|
36
|
+
# HISTORY:
|
37
|
+
#
|
38
|
+
# Cloneable was ported from Jim Weirich's Rake.
|
39
|
+
#
|
40
|
+
# AUTHORS:
|
41
|
+
#
|
42
|
+
# - Ken Bloom (Current Version)
|
43
|
+
# - Jim Weirich (Original Version)
|
44
|
+
#
|
45
|
+
# TODO:
|
46
|
+
# - Is there a more robust means to determining if clone or dup is used?
|
47
|
+
|
48
|
+
# = Cloneable
|
49
|
+
#
|
50
|
+
# Provides a class with deep cloneablity via the standard
|
51
|
+
# #dup and #clone methods.
|
52
|
+
|
53
|
+
module Cloneable
|
54
|
+
def initialize_copy(sibling)
|
55
|
+
#first duplicate my superclass' state. Note that if it's duplicating
|
56
|
+
#instance variables, this will be overwritten, but this is important
|
57
|
+
#because we could be dealing with a C extension with state hidden from
|
58
|
+
#the Ruby interpreter
|
59
|
+
super
|
60
|
+
|
61
|
+
#we want to know if we're being dup'ed or clone'd, because we want to
|
62
|
+
#preserve the state of our internals the same way our state is being
|
63
|
+
#preserved. (If we can't figure it out, we'll just use #dup.)
|
64
|
+
operation=caller.find{|x| x !~ /'initialize_copy'/}.
|
65
|
+
match(/`(dup|clone)'/)[1] or :dup
|
66
|
+
|
67
|
+
sibling.instance_variables.each do |ivar|
|
68
|
+
value = sibling.instance_variable_get(ivar)
|
69
|
+
|
70
|
+
#set my instance variable to be a #dup or #clone
|
71
|
+
#or my sibling, depending on what's happening to me right now
|
72
|
+
instance_variable_set(ivar, value.send(operation))
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
# OLD VERSION
|
78
|
+
|
79
|
+
#module Cloneable
|
80
|
+
# def clone
|
81
|
+
# sibling = self.class.new
|
82
|
+
# instance_variables.each do |ivar|
|
83
|
+
# value = self.instance_variable_get(ivar)
|
84
|
+
# sibling.instance_variable_set(ivar, value.dup) #rake_dup)
|
85
|
+
# end
|
86
|
+
# sibling
|
87
|
+
# end
|
88
|
+
# alias_method :dup, :clone
|
89
|
+
#end
|
90
|
+
|
@@ -202,84 +202,3 @@ module EnumerableArgs
|
|
202
202
|
end
|
203
203
|
=end
|
204
204
|
|
205
|
-
|
206
|
-
# _____ _
|
207
|
-
# |_ _|__ ___| |_
|
208
|
-
# | |/ _ \/ __| __|
|
209
|
-
# | | __/\__ \ |_
|
210
|
-
# |_|\___||___/\__|
|
211
|
-
#
|
212
|
-
|
213
|
-
=begin testing
|
214
|
-
|
215
|
-
require 'test/unit'
|
216
|
-
|
217
|
-
# fixture
|
218
|
-
|
219
|
-
class PlusArray
|
220
|
-
include EnumerablePass
|
221
|
-
def initialize(arr)
|
222
|
-
@arr = arr
|
223
|
-
end
|
224
|
-
def each(n=0)
|
225
|
-
@arr.each{ |e| yield(e+n) }
|
226
|
-
end
|
227
|
-
end
|
228
|
-
|
229
|
-
class TC_Enumerable < Test::Unit::TestCase
|
230
|
-
|
231
|
-
def test_collect
|
232
|
-
t = PlusArray.new([1,2,3])
|
233
|
-
assert_equal( [5,6,7], t.collect(4){ |e| e } )
|
234
|
-
end
|
235
|
-
|
236
|
-
#def test_each_slice
|
237
|
-
# t = PlusArray.new([1,2,3,4])
|
238
|
-
# a = []
|
239
|
-
# t.each_slice(2,4){ |e,f| a << [e,f] }
|
240
|
-
# assert_equal( [[5,6],[7,8]], a )
|
241
|
-
#end
|
242
|
-
|
243
|
-
#def test_find
|
244
|
-
# t = PlusArray.new([1,2,3,4])
|
245
|
-
# f = t.find(2, :ifnone=>lambda{:NOPE}) { |a| a == 10 }
|
246
|
-
# assert_equal(:NOPE, f)
|
247
|
-
#end
|
248
|
-
|
249
|
-
def test_grep
|
250
|
-
# TODO
|
251
|
-
end
|
252
|
-
|
253
|
-
def test_to_a
|
254
|
-
t = PlusArray.new([1,2,3])
|
255
|
-
assert_equal( [5,6,7], t.to_a(4) )
|
256
|
-
end
|
257
|
-
|
258
|
-
def test_min
|
259
|
-
t = PlusArray.new([1,2,3])
|
260
|
-
assert_equal( 5, t.min(4) )
|
261
|
-
end
|
262
|
-
|
263
|
-
def test_max
|
264
|
-
t = PlusArray.new([1,2,3])
|
265
|
-
assert_equal( 7, t.max(4) )
|
266
|
-
end
|
267
|
-
|
268
|
-
def test_include?
|
269
|
-
t = PlusArray.new([1,2,3])
|
270
|
-
assert( t.include?(7,4) )
|
271
|
-
end
|
272
|
-
|
273
|
-
def test_select
|
274
|
-
t = PlusArray.new([1,2,3])
|
275
|
-
assert_equal( [6], t.select(4){ |x| x == 6 } )
|
276
|
-
end
|
277
|
-
|
278
|
-
def test_reject
|
279
|
-
t = PlusArray.new([1,2,3])
|
280
|
-
assert_equal( [5,7], t.reject(4){ |x| x == 6 } )
|
281
|
-
end
|
282
|
-
|
283
|
-
end
|
284
|
-
|
285
|
-
=end
|
File without changes
|
File without changes
|
@@ -43,33 +43,3 @@ class Module
|
|
43
43
|
|
44
44
|
end
|
45
45
|
|
46
|
-
|
47
|
-
# _____ _
|
48
|
-
# |_ _|__ ___| |_
|
49
|
-
# | |/ _ \/ __| __|
|
50
|
-
# | | __/\__ \ |_
|
51
|
-
# |_|\___||___/\__|
|
52
|
-
#
|
53
|
-
=begin test
|
54
|
-
|
55
|
-
require 'test/unit'
|
56
|
-
|
57
|
-
class TestInstantiable < Test::Unit::TestCase
|
58
|
-
|
59
|
-
module M
|
60
|
-
extend Module::Instantiable
|
61
|
-
|
62
|
-
attr_reader :a
|
63
|
-
def initialize( a )
|
64
|
-
@a = a
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
def test_new
|
69
|
-
m = M.new( 1 )
|
70
|
-
assert_equal( 1, m.a )
|
71
|
-
end
|
72
|
-
|
73
|
-
end
|
74
|
-
|
75
|
-
=end
|
File without changes
|
File without changes
|
@@ -0,0 +1,350 @@
|
|
1
|
+
# = TITLE:
|
2
|
+
#
|
3
|
+
# Tasks
|
4
|
+
#
|
5
|
+
# = COPYING:
|
6
|
+
#
|
7
|
+
# Copyright (c) 2007,2008 Tiger Ops
|
8
|
+
#
|
9
|
+
# This file is part of the Reap program.
|
10
|
+
#
|
11
|
+
# Reap is free software: you can redistribute it and/or modify
|
12
|
+
# it under the terms of the GNU General Public License as published by
|
13
|
+
# the Free Software Foundation, either version 3 of the License, or
|
14
|
+
# (at your option) any later version.
|
15
|
+
#
|
16
|
+
# Reap is distributed in the hope that it will be useful,
|
17
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
18
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
19
|
+
# GNU General Public License for more details.
|
20
|
+
#
|
21
|
+
# You should have received a copy of the GNU General Public License
|
22
|
+
# along with Reap. If not, see <http://www.gnu.org/licenses/>.
|
23
|
+
|
24
|
+
#
|
25
|
+
module Reap
|
26
|
+
|
27
|
+
module TaskSystem
|
28
|
+
|
29
|
+
IN_PROGRESS = :__IN_PROGRESS__
|
30
|
+
|
31
|
+
# Define main task.
|
32
|
+
|
33
|
+
def main(name, &block)
|
34
|
+
name, deps, block = *parse_dependencies(name, &block)
|
35
|
+
define_main(name, *deps, &block)
|
36
|
+
end
|
37
|
+
|
38
|
+
# Define a task.
|
39
|
+
|
40
|
+
def task(name, &block)
|
41
|
+
name, deps, block = *parse_dependencies(name, &block)
|
42
|
+
define_task(name, *deps, &block)
|
43
|
+
end
|
44
|
+
|
45
|
+
# Define a build target.
|
46
|
+
|
47
|
+
def file(name, &block)
|
48
|
+
name, deps, block = *parse_dependencies(name, &block)
|
49
|
+
define_file(name, *deps, &block)
|
50
|
+
end
|
51
|
+
|
52
|
+
def goals
|
53
|
+
@goals ||= {}
|
54
|
+
end
|
55
|
+
|
56
|
+
# Complete a goal.
|
57
|
+
|
58
|
+
def run(goal)
|
59
|
+
if rule = rules.find{ |r| r.match?(goal) }
|
60
|
+
action = rule.action(goal)
|
61
|
+
key = action.key
|
62
|
+
if result = goals[key]
|
63
|
+
if result == IN_PROGESS
|
64
|
+
abort "Circular dependency -- #{goal}"
|
65
|
+
else
|
66
|
+
result
|
67
|
+
end
|
68
|
+
else
|
69
|
+
goals[key] = IN_PROGRESS
|
70
|
+
action.needs.each{ |need| run(need) }
|
71
|
+
goals[key] = action.call
|
72
|
+
end
|
73
|
+
else
|
74
|
+
files = Dir.glob(goal)
|
75
|
+
if files.empty?
|
76
|
+
abort "Missing dependency -- #{goal}"
|
77
|
+
else
|
78
|
+
true
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
#def run(goal, arguments=nil)
|
84
|
+
# plan(goal).each{ |action| action.call }
|
85
|
+
#end
|
86
|
+
|
87
|
+
private
|
88
|
+
|
89
|
+
def rules ; @rules ||= [] ; end
|
90
|
+
|
91
|
+
def main_rule ; @main ; end
|
92
|
+
|
93
|
+
#
|
94
|
+
|
95
|
+
def parse_dependencies(name_deps, &block)
|
96
|
+
if Hash===name_deps
|
97
|
+
name = name_deps.keys[0]
|
98
|
+
deps = name_deps.values[0]
|
99
|
+
else
|
100
|
+
name = name_deps
|
101
|
+
deps = []
|
102
|
+
end
|
103
|
+
[name, deps, block]
|
104
|
+
end
|
105
|
+
|
106
|
+
# Define main task.
|
107
|
+
|
108
|
+
def define_main(name=nil, *depend, &block)
|
109
|
+
@main = define_task(name, *depend, &block)
|
110
|
+
end
|
111
|
+
|
112
|
+
# Define a task rule.
|
113
|
+
|
114
|
+
def define_task(name, *depend, &block)
|
115
|
+
rule = Task.new(name, *depend, &block)
|
116
|
+
rules << rule
|
117
|
+
rule
|
118
|
+
end
|
119
|
+
|
120
|
+
# Define a file build rule.
|
121
|
+
|
122
|
+
def define_file(name, *depend, &block)
|
123
|
+
rule = Build.new(name, *depend, &block)
|
124
|
+
rules << rule
|
125
|
+
rule
|
126
|
+
end
|
127
|
+
|
128
|
+
# Call main task.
|
129
|
+
#--
|
130
|
+
# TODO If @main is nil try task by same name a file (?)
|
131
|
+
# If so, be careful of infinite loop via method_missing.
|
132
|
+
#++
|
133
|
+
|
134
|
+
def run_main
|
135
|
+
return unless main_rule
|
136
|
+
run(main_rule.target)
|
137
|
+
end
|
138
|
+
|
139
|
+
# # Build a plan of action given a goal. This is a recursive
|
140
|
+
# # function building up the +todo+ list parameter.
|
141
|
+
#
|
142
|
+
# def plan(goal, todo=[])
|
143
|
+
# if rule = rules.find{ |r| r.match?(goal) }
|
144
|
+
# todo << Action.new(goal, rule)
|
145
|
+
# rule.needs.each do |need|
|
146
|
+
# next if todo.any?{ |r| r.match?(need) }
|
147
|
+
# plan(need, todo)
|
148
|
+
# end
|
149
|
+
# else
|
150
|
+
# todo << Action.new(goal)
|
151
|
+
# end
|
152
|
+
# todo
|
153
|
+
# end
|
154
|
+
|
155
|
+
=begin
|
156
|
+
# Prepare plan, checking for circular dependencies.
|
157
|
+
|
158
|
+
def task_plan(name, list=[])
|
159
|
+
if list.include?(name)
|
160
|
+
raise "Circular dependency #{name}."
|
161
|
+
end
|
162
|
+
|
163
|
+
if task = tasks[name]
|
164
|
+
task.needs.each do |need|
|
165
|
+
need = need.to_s
|
166
|
+
next if list.include?(need)
|
167
|
+
#@tasks[need].task_plan(need, list)
|
168
|
+
task_plan(need, list)
|
169
|
+
end
|
170
|
+
list << task.name
|
171
|
+
elsif name != main_task && fname = batch?(name)
|
172
|
+
# TODO THIS TIES TASKS INTO BATCH, BETTER WAY?
|
173
|
+
task = Task.new(name) do
|
174
|
+
batch(fname)
|
175
|
+
end
|
176
|
+
tasks[name] = task
|
177
|
+
list << task.name
|
178
|
+
elsif build?(name)
|
179
|
+
# TODO THIS TIES TASKS INTO BUILD, BETTER WAY?
|
180
|
+
task = Task.new(name) do
|
181
|
+
build(name)
|
182
|
+
end
|
183
|
+
tasks[name] = task
|
184
|
+
list << task.name
|
185
|
+
else
|
186
|
+
abort "no task -- #{name}"
|
187
|
+
end
|
188
|
+
|
189
|
+
return list
|
190
|
+
end
|
191
|
+
=end
|
192
|
+
|
193
|
+
#
|
194
|
+
|
195
|
+
class Rule
|
196
|
+
attr_reader :target, :needs, :procedure
|
197
|
+
|
198
|
+
def initialize(target, *needs, &procedure)
|
199
|
+
@target = target
|
200
|
+
@needs = needs
|
201
|
+
@procedure = procedure
|
202
|
+
end
|
203
|
+
|
204
|
+
def action(goal)
|
205
|
+
Action.new(self, key(goal))
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|
209
|
+
# Task is a simpliest type of rule --a pure assertion. It stores a task name,
|
210
|
+
# action and it's prerequisite needs.
|
211
|
+
|
212
|
+
class Task < Rule
|
213
|
+
|
214
|
+
def match?(goal)
|
215
|
+
target.to_sym == goal.to_sym
|
216
|
+
end
|
217
|
+
|
218
|
+
def call(goal)
|
219
|
+
procedure.call if procedure
|
220
|
+
end
|
221
|
+
|
222
|
+
def key(goal)
|
223
|
+
goal.to_sym
|
224
|
+
end
|
225
|
+
|
226
|
+
#def action(goal)
|
227
|
+
# Action.new(self, key(goal))
|
228
|
+
#end
|
229
|
+
|
230
|
+
#def needed?(goal)
|
231
|
+
# true
|
232
|
+
#end
|
233
|
+
end
|
234
|
+
|
235
|
+
# The Build class is a file rule. It encapsulates the procedure for
|
236
|
+
# creating a file (or directory).
|
237
|
+
|
238
|
+
class Build < Rule
|
239
|
+
|
240
|
+
# Does a file match this build definition?
|
241
|
+
|
242
|
+
def match?(path)
|
243
|
+
return false unless String===path
|
244
|
+
case target
|
245
|
+
when String
|
246
|
+
File.fnmatch(target, path)
|
247
|
+
when Regexp
|
248
|
+
target =~ path
|
249
|
+
else
|
250
|
+
false # ???
|
251
|
+
end
|
252
|
+
end
|
253
|
+
|
254
|
+
# Call this build process for the given path.
|
255
|
+
|
256
|
+
def call(path)
|
257
|
+
if needs.empty?
|
258
|
+
dated = true
|
259
|
+
elsif File.exist?(path)
|
260
|
+
mtime = File.mtime(path)
|
261
|
+
dated = needs.find do |file|
|
262
|
+
!File.exist?(file) || File.mtime(file) > mtime
|
263
|
+
end
|
264
|
+
else
|
265
|
+
dated = true
|
266
|
+
end
|
267
|
+
procedure.call(path) if dated
|
268
|
+
end
|
269
|
+
|
270
|
+
#
|
271
|
+
|
272
|
+
def key(path)
|
273
|
+
File.expand_path(path.to_s)
|
274
|
+
end
|
275
|
+
|
276
|
+
# # Expanded needs.
|
277
|
+
#
|
278
|
+
# def needs(key)
|
279
|
+
# needed_paths
|
280
|
+
# end
|
281
|
+
#
|
282
|
+
# def needs
|
283
|
+
# #exact = needs.select{|n| File.fnmatch?(n,n)} +
|
284
|
+
# exact = needed.select{|n| n !~ /[\[*?]/ }
|
285
|
+
# globs = @needs.collect{|n| Dir.glob(n)}.flatten
|
286
|
+
# (exact + globs).uniq #globs.uniq
|
287
|
+
# end
|
288
|
+
#
|
289
|
+
# # Is this build needed to update/create path?
|
290
|
+
#
|
291
|
+
# def needed_for?(path)
|
292
|
+
# return true unless File.exist?(path)
|
293
|
+
# return true if needed_paths.empty? # TODO: if there are no prereqs then the file is always considered needed. Correct?
|
294
|
+
# mtimes = needed_paths.collect do |f|
|
295
|
+
# File.exist?(f) ? File.mtime(f) : Time.now
|
296
|
+
# end
|
297
|
+
# mtimes.max > File.mtime(path)
|
298
|
+
# end
|
299
|
+
end
|
300
|
+
|
301
|
+
# An action associates a goal and the rule the fulfills it.
|
302
|
+
|
303
|
+
class Action
|
304
|
+
attr :rule
|
305
|
+
attr :goal
|
306
|
+
|
307
|
+
def initialize(rule, goal)
|
308
|
+
@rule = rule
|
309
|
+
@goal = goal
|
310
|
+
end
|
311
|
+
|
312
|
+
def key
|
313
|
+
rule.key(goal)
|
314
|
+
end
|
315
|
+
|
316
|
+
def call
|
317
|
+
rule.call(goal)
|
318
|
+
end
|
319
|
+
|
320
|
+
def needs
|
321
|
+
rule.needs #(key)
|
322
|
+
end
|
323
|
+
|
324
|
+
def ==(other)
|
325
|
+
case other
|
326
|
+
when Action
|
327
|
+
rule == other.rule && key == other.key
|
328
|
+
else
|
329
|
+
false
|
330
|
+
# when Rule
|
331
|
+
# rule.match?(other)
|
332
|
+
# else
|
333
|
+
# goal == other
|
334
|
+
# end
|
335
|
+
end
|
336
|
+
end
|
337
|
+
|
338
|
+
# def match?(need)
|
339
|
+
# if rule
|
340
|
+
# rule.match?(need)
|
341
|
+
# else
|
342
|
+
# goal == need
|
343
|
+
# end
|
344
|
+
# end
|
345
|
+
|
346
|
+
end
|
347
|
+
|
348
|
+
end
|
349
|
+
|
350
|
+
end
|