facets 2.6.0 → 2.7.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/HISTORY.rdoc +331 -35
- data/MANIFEST +685 -826
- data/{doc/guide/notes.rd → NOTES} +0 -0
- data/README.rdoc +73 -25
- data/Rakefile +245 -2
- data/TODO +5 -0
- data/demo/hook.rd +47 -0
- data/demo/scenario_require.rd +9 -0
- data/doc/README.more +24 -6
- data/doc/manual/about.rb +47 -0
- data/doc/manual/annotations.rdoc +60 -0
- data/doc/manual/associations.rdoc +55 -0
- data/doc/manual/blockups.rdoc +101 -0
- data/doc/manual/capsule.rdoc +34 -0
- data/doc/manual/command.rdoc +177 -0
- data/doc/manual/core.rdoc +37 -0
- data/doc/manual/faq.rdoc +32 -0
- data/doc/manual/typecast.html +112 -0
- data/lib/core/facets.rb +359 -11
- data/lib/core/facets/array/combination.rb +3 -3
- data/lib/core/facets/array/index.rb +4 -1
- data/lib/core/facets/array/permutation.rb +2 -2
- data/lib/core/facets/array/product.rb +1 -1
- data/lib/core/facets/binding/eval.rb +1 -1
- data/lib/core/facets/denumerable.rb +76 -0
- data/lib/core/facets/duplicable.rb +34 -0
- data/lib/core/facets/enumerable/count.rb +10 -4
- data/lib/core/facets/enumerable/defer.rb +77 -0
- data/lib/core/facets/enumerable/each_by.rb +1 -1
- data/lib/core/facets/enumerable/every.rb +35 -0
- data/lib/{more/facets/elementwise.rb → core/facets/enumerable/ewise.rb} +0 -0
- data/lib/core/facets/enumerable/filter.rb +25 -0
- data/lib/core/facets/enumerable/group_by.rb +1 -1
- data/lib/core/facets/enumerable/none.rb +3 -2
- data/lib/core/facets/enumerable/one.rb +3 -2
- data/lib/core/facets/enumerable/per.rb +61 -0
- data/lib/core/facets/exception/raised.rb +14 -0
- data/lib/core/facets/integer/odd.rb +5 -1
- data/lib/core/facets/kernel/__dir__.rb +13 -3
- data/lib/core/facets/kernel/__here__.rb +14 -0
- data/lib/core/facets/kernel/__method__.rb +9 -3
- data/lib/core/facets/kernel/ask.rb +1 -0
- data/lib/core/facets/kernel/equate.rb +13 -0
- data/lib/core/facets/kernel/extension.rb +9 -0
- data/lib/core/facets/kernel/identical.rb +4 -0
- data/lib/core/facets/kernel/instance_exec.rb +2 -1
- data/lib/core/facets/kernel/method.rb +49 -0
- data/lib/core/facets/kernel/object_send.rb +2 -2
- data/lib/core/facets/kernel/{state.rb → object_state.rb} +23 -12
- data/lib/core/facets/kernel/require_all.rb +6 -1
- data/lib/core/facets/kernel/require_local.rb +8 -1
- data/lib/core/facets/kernel/require_relative.rb +52 -0
- data/lib/core/facets/kernel/source_location.rb +13 -0
- data/lib/core/facets/kernel/tap.rb +13 -6
- data/lib/core/facets/module/attr_setter.rb +57 -0
- data/lib/core/facets/module/instance_method.rb +24 -0
- data/lib/core/facets/module/module_load.rb +60 -44
- data/lib/core/facets/module/module_require.rb +1 -0
- data/lib/core/facets/nilclass/to_f.rb +1 -1
- data/lib/core/facets/objectspace/op_fetch.rb +3 -0
- data/lib/core/facets/proc/curry.rb +4 -3
- data/lib/core/facets/string/bytes.rb +10 -4
- data/lib/core/facets/string/camelcase.rb +6 -5
- data/lib/core/facets/string/chars.rb +5 -1
- data/lib/core/facets/string/each_char.rb +1 -1
- data/lib/core/facets/string/each_word.rb +1 -1
- data/lib/core/facets/string/lines.rb +11 -4
- data/lib/core/facets/string/start_with.rb +9 -2
- data/lib/core/facets/string/unfold.rb +27 -0
- data/lib/core/facets/symbol/succ.rb +3 -3
- data/lib/core/facets/symbol/thrown.rb +20 -0
- data/lib/core/facets/symbol/to_proc.rb +3 -2
- data/lib/core/facets/time/to_time.rb +1 -1
- data/lib/core/facets/to_hash.rb +41 -100
- data/lib/core/facets/unboundmethod/name.rb +20 -23
- data/lib/more/facets/ansicode.rb +1 -10
- data/lib/more/facets/autoarray.rb +3 -31
- data/lib/more/facets/basicobject.rb +73 -0
- data/lib/more/facets/blankslate.rb +2 -66
- data/lib/{lore → more}/facets/cgi.rb +0 -0
- data/lib/more/facets/class_extend.rb +1 -0
- data/lib/{lore → more}/facets/continuation.rb +0 -0
- data/lib/{lore → more}/facets/date.rb +3 -3
- data/lib/more/facets/enumargs.rb +192 -0
- data/lib/more/facets/enumerablepass.rb +2 -216
- data/lib/more/facets/enumerator.rb +62 -0
- data/lib/more/facets/{equatable.rb → equitable.rb} +11 -11
- data/lib/more/facets/expirable.rb +13 -41
- data/lib/{lore → more}/facets/fileutils.rb +0 -0
- data/lib/{lore → more}/facets/fileutils/head.rb +0 -0
- data/lib/{lore → more}/facets/fileutils/safe_ln.rb +0 -0
- data/lib/{lore → more}/facets/fileutils/slice.rb +0 -0
- data/lib/{lore → more}/facets/fileutils/tail.rb +0 -0
- data/lib/{lore → more}/facets/fileutils/wc.rb +0 -0
- data/lib/{lore → more}/facets/fileutils/whereis.rb +0 -0
- data/lib/{lore → more}/facets/fileutils/which.rb +0 -0
- data/lib/{lore → more}/facets/getoptlong.rb +0 -0
- data/lib/more/facets/hook.rb +2 -29
- data/lib/more/facets/inheritor.rb +2 -2
- data/lib/more/facets/instance_eval.rb +50 -0
- data/lib/more/facets/instance_function.rb +78 -0
- data/lib/more/facets/main.rb +20 -15
- data/lib/more/facets/memoize.rb +1 -113
- data/lib/more/facets/module/attr.rb +83 -0
- data/lib/more/facets/module/attr_tester.rb +44 -0
- data/lib/more/facets/module/attr_toggler.rb +59 -0
- data/lib/more/facets/module/attr_validator.rb +34 -0
- data/lib/more/facets/{class_extension.rb → module/class_extend.rb} +21 -13
- data/lib/more/facets/once.rb +59 -0
- data/lib/more/facets/openmodule.rb +1 -0
- data/lib/more/facets/orderedhash.rb +1 -33
- data/lib/{lore → more}/facets/ostruct.rb +0 -0
- data/lib/more/facets/ostructable.rb +1 -4
- data/lib/more/facets/partial.rb +18 -16
- data/lib/{lore → more}/facets/pathname.rb +0 -0
- data/lib/more/facets/preinitialize.rb +157 -0
- data/lib/{lore → more}/facets/rbconfig.rb +0 -0
- data/lib/more/facets/recorder.rb +1 -2
- data/lib/{lore → more}/facets/set.rb +0 -0
- data/lib/{lore → more}/facets/shellwords.rb +0 -0
- data/lib/{lore → more}/facets/uri.rb +0 -0
- data/lib/{lore → more}/facets/yaml.rb +0 -0
- data/lib/{lore → more}/facets/zlib.rb +0 -0
- data/meta/loadpath +0 -1
- data/meta/sitemap +4 -0
- data/meta/version +1 -1
- data/test/core/enumerable/test_count.rb +1 -1
- data/test/{more/test_filter.rb → core/enumerable/test_defer.rb} +24 -22
- data/test/{more/test_elementor.rb → core/enumerable/test_every.rb} +2 -15
- data/test/core/enumerable/test_ewise.rb +23 -0
- data/test/core/enumerable/test_per.rb +18 -0
- data/test/core/enumerable/test_take.rb +13 -0
- data/test/core/kernel/test_deepcopy.rb +1 -1
- data/test/{more/test_1stclassmethod.rb → core/kernel/test_method.rb} +2 -7
- data/test/core/kernel/test_tap.rb +1 -1
- data/test/core/proc/test_curry.rb +11 -0
- data/test/core/string/test_bytes.rb +1 -1
- data/test/core/string/test_camelcase.rb +23 -6
- data/test/core/string/test_lines.rb +1 -1
- data/test/core/string/test_unfold.rb +14 -0
- data/test/{more → core}/test_blank.rb +0 -0
- data/test/{more → core}/test_boolean.rb +0 -0
- data/test/{more → core}/test_functor.rb +0 -0
- data/test/{lore → more}/test_basicobject.rb +0 -0
- data/test/more/{test_class_extension.rb → test_class_extend.rb} +6 -6
- data/test/{lore → more}/test_continuation.rb +0 -0
- data/test/{lore → more}/test_date.rb +0 -0
- data/test/more/{test_enumerablepass.rb → test_enumargs.rb} +2 -4
- data/test/more/{test_equatable.rb → test_equitable.rb} +2 -2
- data/test/more/{test_instantise.rb → test_instance_function.rb} +3 -2
- data/test/more/test_memoize.rb +1 -1
- data/test/{lore → more}/test_ostruct.rb +0 -0
- metadata +865 -1016
- data/RELEASE +0 -38
- data/doc/README.lore +0 -51
- data/doc/log/basic_stats/index.html +0 -39
- data/doc/log/changelog.html +0 -648
- data/doc/log/changelog.txt +0 -217
- data/doc/log/stats/index.html +0 -39
- data/doc/log/testlog.txt +0 -278
- data/doc/notes/CHANGES +0 -2529
- data/doc/rdoc/lore/classes/Array.html +0 -176
- data/doc/rdoc/lore/classes/CGI.html +0 -191
- data/doc/rdoc/lore/classes/Config.html +0 -135
- data/doc/rdoc/lore/classes/Continuation.html +0 -113
- data/doc/rdoc/lore/classes/Date.html +0 -631
- data/doc/rdoc/lore/classes/DateTime.html +0 -583
- data/doc/rdoc/lore/classes/Enumerable.html +0 -89
- data/doc/rdoc/lore/classes/Enumerable/Enumerator.html +0 -147
- data/doc/rdoc/lore/classes/File.html +0 -128
- data/doc/rdoc/lore/classes/FileUtils.html +0 -434
- data/doc/rdoc/lore/classes/GetoptLong.html +0 -118
- data/doc/rdoc/lore/classes/GetoptLong/DSL.html +0 -208
- data/doc/rdoc/lore/classes/Kernel.html +0 -135
- data/doc/rdoc/lore/classes/Logger.html +0 -229
- data/doc/rdoc/lore/classes/Logger/Ansicolor.html +0 -277
- data/doc/rdoc/lore/classes/Logger/LogDevice.html +0 -121
- data/doc/rdoc/lore/classes/NilClass.html +0 -119
- data/doc/rdoc/lore/classes/OpenStruct.html +0 -432
- data/doc/rdoc/lore/classes/Pathname.html +0 -353
- data/doc/rdoc/lore/classes/Set.html +0 -117
- data/doc/rdoc/lore/classes/Shellwords.html +0 -111
- data/doc/rdoc/lore/classes/String.html +0 -140
- data/doc/rdoc/lore/classes/Time.html +0 -154
- data/doc/rdoc/lore/classes/URI.html +0 -454
- data/doc/rdoc/lore/classes/URI/Hash.html +0 -105
- data/doc/rdoc/lore/classes/URI/Kernel.html +0 -122
- data/doc/rdoc/lore/classes/Zlib.html +0 -188
- data/doc/rdoc/lore/created.rid +0 -1
- data/doc/rdoc/lore/files/README.html +0 -286
- data/doc/rdoc/lore/files/doc/README_lore.html +0 -155
- data/doc/rdoc/lore/files/lib/lore/facets/basicobject_rb.html +0 -118
- data/doc/rdoc/lore/files/lib/lore/facets/cgi_rb.html +0 -111
- data/doc/rdoc/lore/files/lib/lore/facets/continuation_rb.html +0 -147
- data/doc/rdoc/lore/files/lib/lore/facets/date_rb.html +0 -97
- data/doc/rdoc/lore/files/lib/lore/facets/enumerator_rb.html +0 -111
- data/doc/rdoc/lore/files/lib/lore/facets/fileutils/head_rb.html +0 -96
- data/doc/rdoc/lore/files/lib/lore/facets/fileutils/safe_ln_rb.html +0 -96
- data/doc/rdoc/lore/files/lib/lore/facets/fileutils/slice_rb.html +0 -96
- data/doc/rdoc/lore/files/lib/lore/facets/fileutils/tail_rb.html +0 -96
- data/doc/rdoc/lore/files/lib/lore/facets/fileutils/wc_rb.html +0 -96
- data/doc/rdoc/lore/files/lib/lore/facets/fileutils/whereis_rb.html +0 -96
- data/doc/rdoc/lore/files/lib/lore/facets/fileutils/which_rb.html +0 -96
- data/doc/rdoc/lore/files/lib/lore/facets/fileutils_rb.html +0 -131
- data/doc/rdoc/lore/files/lib/lore/facets/getoptlong_rb.html +0 -135
- data/doc/rdoc/lore/files/lib/lore/facets/logger_rb.html +0 -142
- data/doc/rdoc/lore/files/lib/lore/facets/ostruct_rb.html +0 -135
- data/doc/rdoc/lore/files/lib/lore/facets/pathname_rb.html +0 -145
- data/doc/rdoc/lore/files/lib/lore/facets/rbconfig_rb.html +0 -124
- data/doc/rdoc/lore/files/lib/lore/facets/set_rb.html +0 -96
- data/doc/rdoc/lore/files/lib/lore/facets/shellwords_rb.html +0 -124
- data/doc/rdoc/lore/files/lib/lore/facets/uri_rb.html +0 -125
- data/doc/rdoc/lore/files/lib/lore/facets/yaml_rb.html +0 -146
- data/doc/rdoc/lore/files/lib/lore/facets/zlib_rb.html +0 -97
- data/doc/rdoc/lore/fr_class_index.html +0 -73
- data/doc/rdoc/lore/fr_file_index.html +0 -71
- data/doc/rdoc/lore/fr_method_index.html +0 -177
- data/doc/rdoc/lore/index.html +0 -26
- data/doc/rdoc/lore/rdoc-style.css +0 -177
- data/doc/release-notes/RELEASE-2.0.5 +0 -8
- data/doc/release-notes/RELEASE-2.1.0 +0 -9
- data/doc/release-notes/RELEASE-2.1.1 +0 -5
- data/doc/release-notes/RELEASE-2.1.2 +0 -6
- data/doc/release-notes/RELEASE-2.1.3 +0 -5
- data/doc/release-notes/RELEASE-2.2.0 +0 -14
- data/doc/release-notes/RELEASE-2.2.1 +0 -4
- data/doc/release-notes/RELEASE-2.3.0 +0 -6
- data/doc/release-notes/RELEASE-2.4.0 +0 -70
- data/doc/release-notes/RELEASE-2.4.1 +0 -8
- data/doc/release-notes/RELEASE-2.4.2 +0 -4
- data/doc/release-notes/RELEASE-2.4.3 +0 -78
- data/doc/release-notes/RELEASE-2.4.4 +0 -38
- data/doc/release-notes/RELEASE-2.4.5 +0 -37
- data/doc/release-notes/RELEASE-2.5.0 +0 -83
- data/lib/core/facets/kernel/instance.rb +0 -19
- data/lib/lore/facets/basicobject.rb +0 -14
- data/lib/lore/facets/enumerator.rb +0 -67
- data/lib/lore/facets/logger.rb +0 -291
- data/lib/more/facets/1stclassmethod.rb +0 -140
- data/lib/more/facets/advisable.rb +0 -162
- data/lib/more/facets/association.rb +0 -210
- data/lib/more/facets/attr.rb +0 -209
- data/lib/more/facets/basex.rb +0 -37
- data/lib/more/facets/bbcode.rb +0 -397
- data/lib/more/facets/bicrypt.rb +0 -265
- data/lib/more/facets/binreadable.rb +0 -221
- data/lib/more/facets/censor.rb +0 -97
- data/lib/more/facets/classmethods.rb +0 -199
- data/lib/more/facets/consoleutils.rb +0 -99
- data/lib/more/facets/crypt.rb +0 -166
- data/lib/more/facets/dependency.rb +0 -151
- data/lib/more/facets/downloader.rb +0 -281
- data/lib/more/facets/duplicable.rb +0 -43
- data/lib/more/facets/elementor.rb +0 -133
- data/lib/more/facets/filter.rb +0 -121
- data/lib/more/facets/heap.rb +0 -22
- data/lib/more/facets/infinity.rb +0 -193
- data/lib/more/facets/ini.rb +0 -264
- data/lib/more/facets/instantise.rb +0 -1
- data/lib/more/facets/instantize.rb +0 -95
- data/lib/more/facets/interval.rb +0 -282
- data/lib/more/facets/iteration.rb +0 -65
- data/lib/more/facets/linkedlist.rb +0 -222
- data/lib/more/facets/lrucache.rb +0 -157
- data/lib/more/facets/matcher.rb +0 -140
- data/lib/more/facets/memoizer.rb +0 -74
- data/lib/more/facets/minitar.rb +0 -1063
- data/lib/more/facets/nackclass.rb +0 -41
- data/lib/more/facets/net/smtp_tls.rb +0 -131
- data/lib/more/facets/nilstatus.rb +0 -48
- data/lib/more/facets/overload.rb +0 -94
- data/lib/more/facets/paramix.rb +0 -202
- data/lib/more/facets/pool.rb +0 -91
- data/lib/more/facets/pqueue.rb +0 -449
- data/lib/more/facets/pry.rb +0 -32
- data/lib/more/facets/reflection.rb +0 -145
- data/lib/more/facets/semaphore.rb +0 -92
- data/lib/more/facets/settings.rb +0 -248
- data/lib/more/facets/snapshot.rb +0 -209
- data/lib/more/facets/sparse_array.rb +0 -809
- data/lib/more/facets/string/mask.rb +0 -278
- data/lib/more/facets/string/obfuscate.rb +0 -65
- data/lib/more/facets/string/stylize.rb +0 -169
- data/lib/more/facets/string/words.rb +0 -167
- data/lib/more/facets/syncarray.rb +0 -114
- data/lib/more/facets/synchash.rb +0 -157
- data/lib/more/facets/typecast.rb +0 -261
- data/lib/more/facets/uninheritable.rb +0 -50
- data/lib/more/facets/xmlhash.rb +0 -112
- data/lib/more/facets/xoxo.rb +0 -259
- data/lib/more/facets/ziputils.rb +0 -490
- data/task/conflicts +0 -63
- data/task/coverage.rake +0 -37
- data/task/methods +0 -49
- data/task/rdoc.rake +0 -17
- data/task/setup.rake +0 -38
- data/task/test.rake +0 -145
- data/test/more/test_advisable.rb +0 -71
- data/test/more/test_association.rb +0 -38
- data/test/more/test_bbcode.rb +0 -21
- data/test/more/test_binreadable.rb +0 -50
- data/test/more/test_buildable.rb +0 -73
- data/test/more/test_classmethods.rb +0 -56
- data/test/more/test_crypt.rb +0 -32
- data/test/more/test_dependency.rb +0 -69
- data/test/more/test_elementwise.rb +0 -25
- data/test/more/test_infinity.rb +0 -40
- data/test/more/test_interval.rb +0 -151
- data/test/more/test_linkedlist.rb +0 -41
- data/test/more/test_lrucache.rb +0 -14
- data/test/more/test_overload.rb +0 -160
- data/test/more/test_paramix.rb +0 -170
- data/test/more/test_prototype.rb +0 -35
- data/test/more/test_snapshot.rb +0 -21
- data/test/more/test_sparsearray.rb +0 -279
- data/test/more/test_syncarray.rb +0 -15
- data/test/more/test_synchash.rb +0 -16
- data/test/more/test_typecast.rb +0 -54
- data/test/more/test_uninheritable.rb +0 -31
- data/test/more/test_xoxo.rb +0 -274
- data/test/test_facets.rb +0 -9
data/lib/more/facets/pry.rb
DELETED
@@ -1,32 +0,0 @@
|
|
1
|
-
require 'facets/functor'
|
2
|
-
|
3
|
-
module Kernel
|
4
|
-
|
5
|
-
# Fluent notation for accessing private methods.
|
6
|
-
# This is a meta-progrmmers tool, and not meant
|
7
|
-
# for general use.
|
8
|
-
#
|
9
|
-
# class X
|
10
|
-
# attr :a
|
11
|
-
# private :a
|
12
|
-
# def initialize
|
13
|
-
# @a = 1
|
14
|
-
# end
|
15
|
-
# end
|
16
|
-
#
|
17
|
-
# x = X.new
|
18
|
-
# p x.pry.a #=> 1
|
19
|
-
# p x.a #=> Error
|
20
|
-
#
|
21
|
-
# TODO: Add support for blocks in Ruby 1.9
|
22
|
-
#
|
23
|
-
# CREDIT: trans
|
24
|
-
|
25
|
-
def pry
|
26
|
-
@__pry__ ||= Functor.new do |s, *a|
|
27
|
-
instance_eval{ send(s, *a) }
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
end
|
32
|
-
|
@@ -1,145 +0,0 @@
|
|
1
|
-
# = Reflection
|
2
|
-
#
|
3
|
-
# Provides externailzed, safe access to an object's meta-information.
|
4
|
-
#
|
5
|
-
# == Authors
|
6
|
-
#
|
7
|
-
# * Thomas Sawyer
|
8
|
-
#
|
9
|
-
# == Copying
|
10
|
-
#
|
11
|
-
# Copyright (c) 2006 Thomas Sawyer
|
12
|
-
#
|
13
|
-
# Ruby License
|
14
|
-
#
|
15
|
-
# This module is free software. You may use, modify, and/or redistribute this
|
16
|
-
# software under the same terms as Ruby.
|
17
|
-
#
|
18
|
-
# This program is distributed in the hope that it will be useful, but WITHOUT
|
19
|
-
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
20
|
-
# FOR A PARTICULAR PURPOSE.
|
21
|
-
#
|
22
|
-
# == NOTES
|
23
|
-
#
|
24
|
-
# This is expirmental. Maybe it should be moved to the Trinkets project.
|
25
|
-
# The idea is to be able to access a object as a pure object, by binding
|
26
|
-
# methods called to Object/Kernel first. Thus bypassing any overriden
|
27
|
-
# methods.
|
28
|
-
#
|
29
|
-
# But you can use #at to do this already.
|
30
|
-
#
|
31
|
-
# obj.at(Object).object_id
|
32
|
-
#
|
33
|
-
# For metaprogramming this can be important.
|
34
|
-
|
35
|
-
#
|
36
|
-
class << ObjectSpace
|
37
|
-
alias_method :[], :_id2ref
|
38
|
-
end
|
39
|
-
|
40
|
-
# = ObjectReflection
|
41
|
-
#
|
42
|
-
# obj.__object__.id
|
43
|
-
# obj.__object__.class
|
44
|
-
#
|
45
|
-
# NOTE: This is still an expirmental library.
|
46
|
-
|
47
|
-
class ObjectReflection
|
48
|
-
|
49
|
-
instance_methods.each{|m| private(m) unless m.to_s =~ /^__/ }
|
50
|
-
|
51
|
-
#
|
52
|
-
def initialize(object)
|
53
|
-
@self = object
|
54
|
-
@meth = {}
|
55
|
-
end
|
56
|
-
|
57
|
-
#
|
58
|
-
def id
|
59
|
-
_bind_method(:object_id).call
|
60
|
-
end
|
61
|
-
|
62
|
-
#Kernel.instance_methods.select{ |m| m =~ /^instance_/ }.each do |m|
|
63
|
-
# meth = m.to_s.sub(/^instance_/, '')
|
64
|
-
# module_eval %{
|
65
|
-
# def #{meth}(*a, &b)
|
66
|
-
# _bind_method(:#{m}).call(*a,&b)
|
67
|
-
# end
|
68
|
-
# }
|
69
|
-
#end
|
70
|
-
|
71
|
-
def method_missing(s, *a, &b)
|
72
|
-
_bind_method(s).call(*a, &b)
|
73
|
-
end
|
74
|
-
|
75
|
-
private
|
76
|
-
|
77
|
-
def _bind_method(meth)
|
78
|
-
@meth[meth.to_sym] ||= Kernel.instance_method(meth).bind(@self)
|
79
|
-
end
|
80
|
-
|
81
|
-
end
|
82
|
-
|
83
|
-
module Kernel
|
84
|
-
|
85
|
-
# Binds a method to Object/Kernel before calling it.
|
86
|
-
#
|
87
|
-
# obj.__object__.id
|
88
|
-
# obj.__object__.class
|
89
|
-
#
|
90
|
-
# For metaprogramming this can be important.
|
91
|
-
|
92
|
-
def __object__
|
93
|
-
@_object_reflection ||= ObjectReflection.new(self)
|
94
|
-
end
|
95
|
-
|
96
|
-
#def __instance__
|
97
|
-
# @_instance_reflection ||= InstanceReflection.new(self)
|
98
|
-
#end
|
99
|
-
|
100
|
-
end
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
=begin
|
105
|
-
# = InstanceReflection
|
106
|
-
#
|
107
|
-
# obj.__instance__.id
|
108
|
-
# obj.__instance__.class
|
109
|
-
#
|
110
|
-
#
|
111
|
-
class InstanceReflection < ObjectReflection
|
112
|
-
|
113
|
-
REFLECTION_METHODS = (
|
114
|
-
meths = Kernel.instance_methods.select{ |m| m =~ /^instance_/ }
|
115
|
-
meths += [:send]
|
116
|
-
meths.collect!{|m| m.to_sym}
|
117
|
-
meths.uniq!
|
118
|
-
p meths
|
119
|
-
meths
|
120
|
-
)
|
121
|
-
|
122
|
-
def initialize(object)
|
123
|
-
@self = object
|
124
|
-
@proc = {}
|
125
|
-
#@meta = REFLECTION_METHODS.inject({}) do |rproc, meth|
|
126
|
-
# name = meth.to_s.sub(/^instance_/, '').to_sym
|
127
|
-
# rproc[name] = Kernel.instance_method(meth).bind(@self)
|
128
|
-
# rproc
|
129
|
-
#end
|
130
|
-
end
|
131
|
-
|
132
|
-
REFLECTION_METHODS.each do |meth|
|
133
|
-
name = meth.to_s.sub(/^instance_/, '')
|
134
|
-
|
135
|
-
module_eval %{
|
136
|
-
def #{name}(*a,&b)
|
137
|
-
@proc[:#{meth}] ||= Kernel.instance_method(:#{meth}).bind(@self)
|
138
|
-
@proc[:#{meth}].call(*a,&b)
|
139
|
-
end
|
140
|
-
}, __FILE__, __LINE__
|
141
|
-
end
|
142
|
-
|
143
|
-
end
|
144
|
-
=end
|
145
|
-
|
@@ -1,92 +0,0 @@
|
|
1
|
-
# = Semaphore
|
2
|
-
#
|
3
|
-
# Technically a semaphore is simply an integer variable which
|
4
|
-
# has an execution queue associated with it.
|
5
|
-
#
|
6
|
-
# == Authors
|
7
|
-
#
|
8
|
-
# * Fukumoto
|
9
|
-
#
|
10
|
-
# = Copying
|
11
|
-
#
|
12
|
-
# Copyright (c) 2005 Fukumoto
|
13
|
-
#
|
14
|
-
# Ruby License
|
15
|
-
#
|
16
|
-
# This module is free software. You may use, modify, and/or redistribute this
|
17
|
-
# software under the same terms as Ruby.
|
18
|
-
#
|
19
|
-
# This program is distributed in the hope that it will be useful, but WITHOUT
|
20
|
-
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
21
|
-
# FOR A PARTICULAR PURPOSE.
|
22
|
-
|
23
|
-
|
24
|
-
# = Semaphore
|
25
|
-
#
|
26
|
-
# Technically a semaphore is simply an integer variable which
|
27
|
-
# has an execution queue associated with it.
|
28
|
-
#
|
29
|
-
class Semaphore
|
30
|
-
|
31
|
-
def initialize(initvalue = 0)
|
32
|
-
@counter = initvalue
|
33
|
-
@waiting_list = []
|
34
|
-
end
|
35
|
-
|
36
|
-
def wait
|
37
|
-
Thread.critical = true
|
38
|
-
if (@counter -= 1) < 0
|
39
|
-
@waiting_list.push(Thread.current)
|
40
|
-
Thread.stop
|
41
|
-
end
|
42
|
-
self
|
43
|
-
ensure
|
44
|
-
Thread.critical = false
|
45
|
-
end
|
46
|
-
|
47
|
-
def signal
|
48
|
-
Thread.critical = true
|
49
|
-
begin
|
50
|
-
if (@counter += 1) <= 0
|
51
|
-
t = @waiting_list.shift
|
52
|
-
t.wakeup if t
|
53
|
-
end
|
54
|
-
rescue ThreadError
|
55
|
-
retry
|
56
|
-
end
|
57
|
-
self
|
58
|
-
ensure
|
59
|
-
Thread.critical = false
|
60
|
-
end
|
61
|
-
|
62
|
-
alias_method( :down, :wait )
|
63
|
-
alias_method( :up, :signal )
|
64
|
-
alias_method( :p, :wait )
|
65
|
-
alias_method( :v, :signal )
|
66
|
-
|
67
|
-
def exclusive
|
68
|
-
wait
|
69
|
-
yield
|
70
|
-
ensure
|
71
|
-
signal
|
72
|
-
end
|
73
|
-
|
74
|
-
alias_method( :synchronize, :exclusive )
|
75
|
-
|
76
|
-
end
|
77
|
-
|
78
|
-
|
79
|
-
# _____ _
|
80
|
-
# |_ _|__ ___| |_
|
81
|
-
# | |/ _ \/ __| __|
|
82
|
-
# | | __/\__ \ |_
|
83
|
-
# |_|\___||___/\__|
|
84
|
-
#
|
85
|
-
|
86
|
-
# TODO
|
87
|
-
|
88
|
-
=begin #test
|
89
|
-
|
90
|
-
require 'test/unit'
|
91
|
-
|
92
|
-
=end
|
data/lib/more/facets/settings.rb
DELETED
@@ -1,248 +0,0 @@
|
|
1
|
-
# = Settings
|
2
|
-
#
|
3
|
-
# Settings holds configuration information organized by
|
4
|
-
# Owners. An owner is a class that represents the system to be
|
5
|
-
# configured. An alias for this class is Settings.
|
6
|
-
#
|
7
|
-
# You can pass strings, constants or symbols as keys for the
|
8
|
-
# classes to be configured. Passing symbols you can configure
|
9
|
-
# classes even before they are defined.
|
10
|
-
#
|
11
|
-
# == Authors
|
12
|
-
#
|
13
|
-
# * George Moschovitis
|
14
|
-
#
|
15
|
-
# == Todo
|
16
|
-
#
|
17
|
-
# * Implement with annotations.
|
18
|
-
#
|
19
|
-
# == Copying
|
20
|
-
#
|
21
|
-
# Copyright (c) 2005 George Moschovitis
|
22
|
-
#
|
23
|
-
# Ruby License
|
24
|
-
#
|
25
|
-
# This module is free software. You may use, modify, and/or redistribute this
|
26
|
-
# software under the same terms as Ruby.
|
27
|
-
#
|
28
|
-
# This program is distributed in the hope that it will be useful, but WITHOUT
|
29
|
-
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
30
|
-
# FOR A PARTICULAR PURPOSE.
|
31
|
-
|
32
|
-
require 'yaml'
|
33
|
-
require 'facets/kernel/constant'
|
34
|
-
require 'facets/string/capitalized'
|
35
|
-
require 'facets/synchash'
|
36
|
-
require 'facets/dictionary'
|
37
|
-
|
38
|
-
# = Settings
|
39
|
-
#
|
40
|
-
# Settings holds configuration information organized by
|
41
|
-
# Owners. An owner is a class that represents the system to be
|
42
|
-
# configured. An alias for this class is Settings.
|
43
|
-
#
|
44
|
-
# You can pass strings, constants or symbols as keys for the
|
45
|
-
# classes to be configured. Passing symbols you can configure
|
46
|
-
# classes even before they are defined.
|
47
|
-
#
|
48
|
-
class Settings
|
49
|
-
|
50
|
-
# A hash of setting owners. Use double @'s to allow for
|
51
|
-
# the Settings alias.
|
52
|
-
#--
|
53
|
-
# TODO: find a better name.
|
54
|
-
#++
|
55
|
-
|
56
|
-
@@owners = SyncHash.new
|
57
|
-
|
58
|
-
# A datastructure to store Settings metadata.
|
59
|
-
#
|
60
|
-
# Please note the difference between :default and :value,
|
61
|
-
# :default does NOT override :value.
|
62
|
-
|
63
|
-
class Setting
|
64
|
-
attr_accessor :owner, :name, :type, :value, :options
|
65
|
-
|
66
|
-
def initialize(owner, name, options)
|
67
|
-
if options.key? :value
|
68
|
-
@value = options[:value]
|
69
|
-
elsif options.key? :default
|
70
|
-
@value = options[:default]
|
71
|
-
else
|
72
|
-
raise ArgumentError.new('A value is required')
|
73
|
-
end
|
74
|
-
|
75
|
-
@owner, @name = owner, name
|
76
|
-
@options = options
|
77
|
-
@type = options[:type] = options[:type] || @value.class
|
78
|
-
end
|
79
|
-
|
80
|
-
# Update the setting from an options hash. The update does
|
81
|
-
# NOT take default values into account!
|
82
|
-
|
83
|
-
def update(hash)
|
84
|
-
if hash.key? :value
|
85
|
-
@value = hash[:value]
|
86
|
-
@type = @value.class
|
87
|
-
end
|
88
|
-
|
89
|
-
if hash.key? :type
|
90
|
-
@type = hash[:type]
|
91
|
-
end
|
92
|
-
|
93
|
-
@options.update(hash)
|
94
|
-
end
|
95
|
-
|
96
|
-
# Text representation of this setting.
|
97
|
-
|
98
|
-
def to_s
|
99
|
-
@value.to_s
|
100
|
-
end
|
101
|
-
|
102
|
-
end
|
103
|
-
|
104
|
-
# A collection of Settings. This helper enables intuitive
|
105
|
-
# settings initialization like this:
|
106
|
-
#
|
107
|
-
# Settings.Compiler.template_root = 'public'
|
108
|
-
# instead of
|
109
|
-
# Settings.setting :compiler, :template_root, :value => 'public'
|
110
|
-
|
111
|
-
class SettingCollection < Hash
|
112
|
-
attr_accessor :owner
|
113
|
-
|
114
|
-
# Handles setting readers and writers.
|
115
|
-
|
116
|
-
def method_missing(sym, *args)
|
117
|
-
if sym.to_s =~ /=$/
|
118
|
-
# Remove trailing
|
119
|
-
sym = sym.to_s.gsub(/=/, '').to_sym
|
120
|
-
Settings.setting @owner, sym, :value => args.first
|
121
|
-
else
|
122
|
-
self[sym]
|
123
|
-
end
|
124
|
-
end
|
125
|
-
end
|
126
|
-
|
127
|
-
class << self
|
128
|
-
|
129
|
-
# Inject the Settings parameters provided as a hash
|
130
|
-
# (dictionary, ordered) to classes to be configured.
|
131
|
-
#
|
132
|
-
# === Warning: Pass an ordered hash (dictionary)
|
133
|
-
|
134
|
-
def setup(options)
|
135
|
-
options.each do |owner, ss|
|
136
|
-
next unless ss
|
137
|
-
ss.each do |name, s|
|
138
|
-
add_setting(owner, name.to_sym, :value => s)
|
139
|
-
end
|
140
|
-
end
|
141
|
-
end
|
142
|
-
|
143
|
-
# Parse Settings parameters in yaml format.
|
144
|
-
|
145
|
-
def parse(options)
|
146
|
-
temp = YAML::load(options)
|
147
|
-
options = Dictionary.new
|
148
|
-
temp.each do |k, v|
|
149
|
-
begin
|
150
|
-
options[k.gsub(/\./, '::').to_sym] = v
|
151
|
-
rescue Object
|
152
|
-
options[k] = v
|
153
|
-
end
|
154
|
-
end
|
155
|
-
|
156
|
-
setup(options)
|
157
|
-
end
|
158
|
-
|
159
|
-
# Load and parse an external yaml Settings file.
|
160
|
-
|
161
|
-
def load(filename)
|
162
|
-
parse(File.read(filename))
|
163
|
-
end
|
164
|
-
|
165
|
-
# Manually add a Settings setting. The class key can
|
166
|
-
# be the actual class name constant or a symbol. If the
|
167
|
-
# setting is already defined it updates it.
|
168
|
-
#
|
169
|
-
# === Examples
|
170
|
-
#
|
171
|
-
# Settings.add_setting Compiler, :verification, :value => 12, :doc => '...'
|
172
|
-
# Settings.setting :IdPart, :verify_registration_email, :value => false
|
173
|
-
# s = Settings.Compiler.verification.value
|
174
|
-
|
175
|
-
def add_setting(owner, name, options)
|
176
|
-
owner = owner.to_s.to_sym
|
177
|
-
@@owners[owner] ||= {}
|
178
|
-
if s = @@owners[owner][name]
|
179
|
-
# The setting already exists, update it.
|
180
|
-
s.update(options)
|
181
|
-
else
|
182
|
-
# The setting does not exist, create it.
|
183
|
-
@@owners[owner][name] = Setting.new(owner, name, options)
|
184
|
-
end
|
185
|
-
end
|
186
|
-
alias_method :setting, :add_setting
|
187
|
-
|
188
|
-
# Return the settings for the given owner. The owner is
|
189
|
-
# typically the Class that represents the system to be
|
190
|
-
# configured. If no class is provided, it returns all the
|
191
|
-
# registered settings.
|
192
|
-
|
193
|
-
def settings(owner = nil)
|
194
|
-
if owner
|
195
|
-
owner = owner.to_s.to_sym
|
196
|
-
@@owners[owner]
|
197
|
-
else
|
198
|
-
@@owners.values.inject([]) { |memo, obj| memo.concat(obj.values) }
|
199
|
-
end
|
200
|
-
end
|
201
|
-
alias_method :all, :settings
|
202
|
-
alias_method :[], :settings
|
203
|
-
|
204
|
-
#--
|
205
|
-
# FIXME: this does not work as expected.
|
206
|
-
#++
|
207
|
-
|
208
|
-
def method_missing(sym)
|
209
|
-
if sym.to_s.capitalized?
|
210
|
-
bdl = SettingCollection.new
|
211
|
-
bdl.owner = sym
|
212
|
-
if hash = self[sym]
|
213
|
-
bdl.update(hash)
|
214
|
-
end
|
215
|
-
return bdl
|
216
|
-
end
|
217
|
-
end
|
218
|
-
end
|
219
|
-
|
220
|
-
end
|
221
|
-
|
222
|
-
|
223
|
-
class Module
|
224
|
-
|
225
|
-
# Defines a configuration setting for the enclosing class.
|
226
|
-
#
|
227
|
-
# === Example
|
228
|
-
#
|
229
|
-
# class Compiler
|
230
|
-
# setting :template_root, :default => 'src/template', :doc => 'The template root dir'
|
231
|
-
# end
|
232
|
-
|
233
|
-
def setting(sym, options = {})
|
234
|
-
Settings.add_setting(self, sym, options)
|
235
|
-
|
236
|
-
module_eval %{
|
237
|
-
def self.#{sym}
|
238
|
-
Settings[#{self}][:#{sym}].value
|
239
|
-
end
|
240
|
-
|
241
|
-
def self.#{sym}=(obj)
|
242
|
-
Settings.setting #{self}, :#{sym}, :value => obj
|
243
|
-
end
|
244
|
-
}
|
245
|
-
end
|
246
|
-
|
247
|
-
end
|
248
|
-
|