nuggets 0.9.9 → 1.0.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.
- checksums.yaml +4 -4
- data/COPYING +663 -0
- data/ChangeLog +7 -0
- data/README +74 -0
- data/Rakefile +50 -0
- data/lib/nuggets.rb +73 -0
- data/lib/nuggets/all.rb +35 -0
- data/lib/nuggets/all_mixins.rb +33 -0
- data/lib/nuggets/ansicolor2css.rb +124 -0
- data/lib/nuggets/argv/option.rb +3 -0
- data/lib/nuggets/argv/option_mixin.rb +84 -0
- data/lib/nuggets/array/boost.rb +5 -0
- data/lib/nuggets/array/boost_mixin.rb +77 -0
- data/lib/nuggets/array/combination.rb +62 -0
- data/lib/nuggets/array/correlation.rb +5 -0
- data/lib/nuggets/array/correlation_mixin.rb +63 -0
- data/lib/nuggets/array/flatten_once.rb +56 -0
- data/lib/nuggets/array/flush.rb +5 -0
- data/lib/nuggets/array/flush_mixin.rb +46 -0
- data/lib/nuggets/array/format.rb +65 -0
- data/lib/nuggets/array/hashify.rb +5 -0
- data/lib/nuggets/array/hashify_mixin.rb +47 -0
- data/lib/nuggets/array/histogram.rb +5 -0
- data/lib/nuggets/array/histogram_mixin.rb +169 -0
- data/lib/nuggets/array/in_order.rb +50 -0
- data/lib/nuggets/array/limit.rb +5 -0
- data/lib/nuggets/array/limit_mixin.rb +56 -0
- data/lib/nuggets/array/mean.rb +5 -0
- data/lib/nuggets/array/mean_mixin.rb +202 -0
- data/lib/nuggets/array/median.rb +5 -0
- data/lib/nuggets/array/median_mixin.rb +73 -0
- data/lib/nuggets/array/mode.rb +5 -0
- data/lib/nuggets/array/mode_mixin.rb +69 -0
- data/lib/nuggets/array/monotone.rb +83 -0
- data/lib/nuggets/array/only.rb +41 -0
- data/lib/nuggets/array/rand.rb +44 -0
- data/lib/nuggets/array/regression.rb +5 -0
- data/lib/nuggets/array/regression_mixin.rb +149 -0
- data/lib/nuggets/array/runiq.rb +5 -0
- data/lib/nuggets/array/runiq_mixin.rb +52 -0
- data/lib/nuggets/array/shuffle.rb +132 -0
- data/lib/nuggets/array/standard_deviation.rb +5 -0
- data/lib/nuggets/array/standard_deviation_mixin.rb +50 -0
- data/lib/nuggets/array/to_hash.rb +64 -0
- data/lib/nuggets/array/variance.rb +5 -0
- data/lib/nuggets/array/variance_mixin.rb +81 -0
- data/lib/nuggets/content_type.rb +97 -0
- data/lib/nuggets/dotted_decimal.rb +59 -0
- data/lib/nuggets/enumerable/agrep.rb +79 -0
- data/lib/nuggets/enumerable/all_any_extended.rb +66 -0
- data/lib/nuggets/enumerable/minmax.rb +102 -0
- data/lib/nuggets/env/set.rb +3 -0
- data/lib/nuggets/env/set_mixin.rb +67 -0
- data/lib/nuggets/env/user_encoding.rb +3 -0
- data/lib/nuggets/env/user_encoding_mixin.rb +54 -0
- data/lib/nuggets/env/user_home.rb +3 -0
- data/lib/nuggets/env/user_home_mixin.rb +56 -0
- data/lib/nuggets/file/ext.rb +5 -0
- data/lib/nuggets/file/ext_mixin.rb +87 -0
- data/lib/nuggets/file/replace.rb +5 -0
- data/lib/nuggets/file/replace_mixin.rb +55 -0
- data/lib/nuggets/file/sub.rb +5 -0
- data/lib/nuggets/file/sub_mixin.rb +95 -0
- data/lib/nuggets/file/which.rb +5 -0
- data/lib/nuggets/file/which_mixin.rb +72 -0
- data/lib/nuggets/hash/at.rb +68 -0
- data/lib/nuggets/hash/deep_fetch.rb +5 -0
- data/lib/nuggets/hash/deep_fetch_mixin.rb +74 -0
- data/lib/nuggets/hash/deep_merge.rb +5 -0
- data/lib/nuggets/hash/deep_merge_mixin.rb +53 -0
- data/lib/nuggets/hash/idmap.rb +5 -0
- data/lib/nuggets/hash/idmap_mixin.rb +41 -0
- data/lib/nuggets/hash/in_order.rb +43 -0
- data/lib/nuggets/hash/insert.rb +53 -0
- data/lib/nuggets/hash/nest.rb +5 -0
- data/lib/nuggets/hash/nest_mixin.rb +78 -0
- data/lib/nuggets/hash/only.rb +52 -0
- data/lib/nuggets/hash/seen.rb +5 -0
- data/lib/nuggets/hash/seen_mixin.rb +58 -0
- data/lib/nuggets/hash/unroll.rb +5 -0
- data/lib/nuggets/hash/unroll_mixin.rb +88 -0
- data/lib/nuggets/hash/zip.rb +5 -0
- data/lib/nuggets/hash/zip_mixin.rb +159 -0
- data/lib/nuggets/i18n.rb +155 -0
- data/lib/nuggets/integer/factorial.rb +56 -0
- data/lib/nuggets/integer/length.rb +5 -0
- data/lib/nuggets/integer/length_mixin.rb +49 -0
- data/lib/nuggets/integer/map.rb +5 -0
- data/lib/nuggets/integer/map_mixin.rb +42 -0
- data/lib/nuggets/integer/to_binary_s.rb +38 -0
- data/lib/nuggets/io/agrep.rb +43 -0
- data/lib/nuggets/io/interact.rb +5 -0
- data/lib/nuggets/io/interact_mixin.rb +159 -0
- data/lib/nuggets/io/modes.rb +121 -0
- data/lib/nuggets/io/null.rb +5 -0
- data/lib/nuggets/io/null_mixin.rb +40 -0
- data/lib/nuggets/io/redirect.rb +5 -0
- data/lib/nuggets/io/redirect_mixin.rb +50 -0
- data/lib/nuggets/lazy_attr.rb +44 -0
- data/lib/nuggets/log_parser.rb +70 -0
- data/lib/nuggets/log_parser/apache.rb +101 -0
- data/lib/nuggets/log_parser/rails.rb +219 -0
- data/lib/nuggets/net/success.rb +59 -0
- data/lib/nuggets/numeric/between.rb +2 -0
- data/lib/nuggets/numeric/duration.rb +100 -0
- data/lib/nuggets/numeric/limit.rb +62 -0
- data/lib/nuggets/numeric/signum.rb +52 -0
- data/lib/nuggets/numeric/to_multiple.rb +61 -0
- data/lib/nuggets/object/blank.rb +20 -0
- data/lib/nuggets/object/blank_mixin.rb +99 -0
- data/lib/nuggets/object/boolean.rb +5 -0
- data/lib/nuggets/object/boolean_mixin.rb +61 -0
- data/lib/nuggets/object/eigenclass.rb +2 -0
- data/lib/nuggets/object/ghost_class.rb +2 -0
- data/lib/nuggets/object/metaclass.rb +2 -0
- data/lib/nuggets/object/msend.rb +5 -0
- data/lib/nuggets/object/msend_mixin.rb +43 -0
- data/lib/nuggets/object/silence.rb +5 -0
- data/lib/nuggets/object/silence_mixin.rb +44 -0
- data/lib/nuggets/object/singleton_class.rb +5 -0
- data/lib/nuggets/object/singleton_class_mixin.rb +95 -0
- data/lib/nuggets/object/uniclass.rb +2 -0
- data/lib/nuggets/object/virtual_class.rb +2 -0
- data/lib/nuggets/pluggable.rb +91 -0
- data/lib/nuggets/proc/bind.rb +5 -0
- data/lib/nuggets/proc/bind_mixin.rb +51 -0
- data/lib/nuggets/range/quantile.rb +5 -0
- data/lib/nuggets/range/quantile_mixin.rb +42 -0
- data/lib/nuggets/ruby.rb +235 -0
- data/lib/nuggets/statistics.rb +12 -0
- data/lib/nuggets/statistics_mixins.rb +12 -0
- data/lib/nuggets/string/camelscore.rb +5 -0
- data/lib/nuggets/string/camelscore_mixin.rb +116 -0
- data/lib/nuggets/string/capitalize_first.rb +46 -0
- data/lib/nuggets/string/case.rb +81 -0
- data/lib/nuggets/string/evaluate.rb +5 -0
- data/lib/nuggets/string/evaluate_mixin.rb +47 -0
- data/lib/nuggets/string/msub.rb +84 -0
- data/lib/nuggets/string/nsub.rb +65 -0
- data/lib/nuggets/string/sub_with_md.rb +111 -0
- data/lib/nuggets/string/wc.rb +5 -0
- data/lib/nuggets/string/wc_mixin.rb +95 -0
- data/lib/nuggets/string/word_wrap.rb +76 -0
- data/lib/nuggets/string/xor.rb +5 -0
- data/lib/nuggets/string/xor_mixin.rb +59 -0
- data/lib/nuggets/tempfile/open.rb +57 -0
- data/lib/nuggets/uri/content_type.rb +5 -0
- data/lib/nuggets/uri/content_type_mixin.rb +47 -0
- data/lib/nuggets/uri/exist.rb +5 -0
- data/lib/nuggets/uri/exist_mixin.rb +56 -0
- data/lib/nuggets/uri/redirect.rb +5 -0
- data/lib/nuggets/uri/redirect_mixin.rb +101 -0
- data/lib/nuggets/version.rb +27 -0
- data/spec/nuggets/array/boost_spec.rb +50 -0
- data/spec/nuggets/array/combination_spec.rb +25 -0
- data/spec/nuggets/array/correlation_spec.rb +81 -0
- data/spec/nuggets/array/flatten_once_spec.rb +16 -0
- data/spec/nuggets/array/flush_spec.rb +43 -0
- data/spec/nuggets/array/format_spec.rb +52 -0
- data/spec/nuggets/array/hashify_spec.rb +41 -0
- data/spec/nuggets/array/histogram_spec.rb +87 -0
- data/spec/nuggets/array/in_order_spec.rb +13 -0
- data/spec/nuggets/array/limit_spec.rb +62 -0
- data/spec/nuggets/array/mean_spec.rb +203 -0
- data/spec/nuggets/array/median_spec.rb +77 -0
- data/spec/nuggets/array/mode_spec.rb +57 -0
- data/spec/nuggets/array/monotone_spec.rb +30 -0
- data/spec/nuggets/array/only_spec.rb +26 -0
- data/spec/nuggets/array/regression_spec.rb +54 -0
- data/spec/nuggets/array/runiq_spec.rb +25 -0
- data/spec/nuggets/array/standard_deviation_spec.rb +33 -0
- data/spec/nuggets/array/to_hash_spec.rb +28 -0
- data/spec/nuggets/array/variance_spec.rb +106 -0
- data/spec/nuggets/dotted_decimal_spec.rb +27 -0
- data/spec/nuggets/enumerable/all_any_extended_spec.rb +31 -0
- data/spec/nuggets/enumerable/minmax_spec.rb +21 -0
- data/spec/nuggets/env/set_spec.rb +29 -0
- data/spec/nuggets/env/user_encoding_spec.rb +38 -0
- data/spec/nuggets/env/user_home_spec.rb +42 -0
- data/spec/nuggets/file/ext_spec.rb +38 -0
- data/spec/nuggets/file/replace_spec.rb +95 -0
- data/spec/nuggets/file/sub_spec.rb +149 -0
- data/spec/nuggets/file/which_spec.rb +22 -0
- data/spec/nuggets/hash/at_spec.rb +19 -0
- data/spec/nuggets/hash/deep_fetch_spec.rb +159 -0
- data/spec/nuggets/hash/deep_merge_spec.rb +78 -0
- data/spec/nuggets/hash/in_order_spec.rb +12 -0
- data/spec/nuggets/hash/insert_spec.rb +13 -0
- data/spec/nuggets/hash/nest_spec.rb +102 -0
- data/spec/nuggets/hash/only_spec.rb +29 -0
- data/spec/nuggets/hash/seen_spec.rb +36 -0
- data/spec/nuggets/hash/unroll_spec.rb +68 -0
- data/spec/nuggets/i18n_spec.rb +13 -0
- data/spec/nuggets/integer/factorial_spec.rb +10 -0
- data/spec/nuggets/integer/length_spec.rb +18 -0
- data/spec/nuggets/integer/map_spec.rb +19 -0
- data/spec/nuggets/integer/to_binary_s_spec.rb +19 -0
- data/spec/nuggets/numeric/duration_spec.rb +25 -0
- data/spec/nuggets/numeric/limit_spec.rb +16 -0
- data/spec/nuggets/numeric/signum_spec.rb +16 -0
- data/spec/nuggets/numeric/to_multiple_spec.rb +16 -0
- data/spec/nuggets/object/blank_spec.rb +34 -0
- data/spec/nuggets/object/boolean_spec.rb +23 -0
- data/spec/nuggets/object/msend_spec.rb +25 -0
- data/spec/nuggets/object/silence_spec.rb +36 -0
- data/spec/nuggets/object/singleton_class_spec.rb +51 -0
- data/spec/nuggets/proc/bind_spec.rb +28 -0
- data/spec/nuggets/range/quantile_spec.rb +33 -0
- data/spec/nuggets/string/camelscore_spec.rb +114 -0
- data/spec/nuggets/string/capitalize_first_spec.rb +13 -0
- data/spec/nuggets/string/case_spec.rb +31 -0
- data/spec/nuggets/string/evaluate_spec.rb +24 -0
- data/spec/nuggets/string/msub_spec.rb +20 -0
- data/spec/nuggets/string/nsub_spec.rb +13 -0
- data/spec/nuggets/string/sub_with_md_spec.rb +25 -0
- data/spec/nuggets/string/wc_spec.rb +73 -0
- data/spec/nuggets/string/word_wrap_spec.rb +81 -0
- data/spec/nuggets/string/xor_spec.rb +57 -0
- data/spec/nuggets/uri/content_type_spec.rb +42 -0
- data/spec/nuggets/uri/exist_spec.rb +49 -0
- data/spec/spec_helper.rb +36 -0
- metadata +309 -17
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
#--
|
|
2
|
+
###############################################################################
|
|
3
|
+
# #
|
|
4
|
+
# nuggets -- Extending Ruby #
|
|
5
|
+
# #
|
|
6
|
+
# Copyright (C) 2007-2011 Jens Wille #
|
|
7
|
+
# #
|
|
8
|
+
# Authors: #
|
|
9
|
+
# Jens Wille <jens.wille@gmail.com> #
|
|
10
|
+
# #
|
|
11
|
+
# nuggets is free software; you can redistribute it and/or modify it under #
|
|
12
|
+
# the terms of the GNU Affero General Public License as published by the Free #
|
|
13
|
+
# Software Foundation; either version 3 of the License, or (at your option) #
|
|
14
|
+
# any later version. #
|
|
15
|
+
# #
|
|
16
|
+
# nuggets is distributed in the hope that it will be useful, but WITHOUT ANY #
|
|
17
|
+
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS #
|
|
18
|
+
# FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for #
|
|
19
|
+
# more details. #
|
|
20
|
+
# #
|
|
21
|
+
# You should have received a copy of the GNU Affero General Public License #
|
|
22
|
+
# along with nuggets. If not, see <http://www.gnu.org/licenses/>. #
|
|
23
|
+
# #
|
|
24
|
+
###############################################################################
|
|
25
|
+
#++
|
|
26
|
+
|
|
27
|
+
module Nuggets
|
|
28
|
+
class Object
|
|
29
|
+
module BooleanMixin
|
|
30
|
+
|
|
31
|
+
# call-seq:
|
|
32
|
+
# object.boolean? => +true+ or +false+
|
|
33
|
+
#
|
|
34
|
+
#
|
|
35
|
+
def boolean?
|
|
36
|
+
is_a?(::TrueClass) || is_a?(::FalseClass)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# call-seq:
|
|
40
|
+
# object.negate => +true+ or +false+
|
|
41
|
+
#
|
|
42
|
+
#
|
|
43
|
+
def negate
|
|
44
|
+
!self
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
alias_method :false?, :negate
|
|
48
|
+
|
|
49
|
+
# call-seq:
|
|
50
|
+
# object.to_bool => +true+ or +false+
|
|
51
|
+
#
|
|
52
|
+
#
|
|
53
|
+
def to_bool
|
|
54
|
+
!!self
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
alias_method :true?, :to_bool
|
|
58
|
+
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
#--
|
|
2
|
+
###############################################################################
|
|
3
|
+
# #
|
|
4
|
+
# nuggets -- Extending Ruby #
|
|
5
|
+
# #
|
|
6
|
+
# Copyright (C) 2007-2011 Jens Wille #
|
|
7
|
+
# #
|
|
8
|
+
# Authors: #
|
|
9
|
+
# Jens Wille <jens.wille@gmail.com> #
|
|
10
|
+
# #
|
|
11
|
+
# nuggets is free software; you can redistribute it and/or modify it under #
|
|
12
|
+
# the terms of the GNU Affero General Public License as published by the Free #
|
|
13
|
+
# Software Foundation; either version 3 of the License, or (at your option) #
|
|
14
|
+
# any later version. #
|
|
15
|
+
# #
|
|
16
|
+
# nuggets is distributed in the hope that it will be useful, but WITHOUT ANY #
|
|
17
|
+
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS #
|
|
18
|
+
# FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for #
|
|
19
|
+
# more details. #
|
|
20
|
+
# #
|
|
21
|
+
# You should have received a copy of the GNU Affero General Public License #
|
|
22
|
+
# along with nuggets. If not, see <http://www.gnu.org/licenses/>. #
|
|
23
|
+
# #
|
|
24
|
+
###############################################################################
|
|
25
|
+
#++
|
|
26
|
+
|
|
27
|
+
module Nuggets
|
|
28
|
+
class Object
|
|
29
|
+
module MSendMixin
|
|
30
|
+
|
|
31
|
+
# call-seq:
|
|
32
|
+
# object.msend(*messages) => anArray
|
|
33
|
+
#
|
|
34
|
+
# Sends _object_ multiple +messages+ and returns an array of the individual
|
|
35
|
+
# return values.
|
|
36
|
+
def msend(*messages)
|
|
37
|
+
hash = messages.last.is_a?(::Hash) ? messages.pop : {}
|
|
38
|
+
(messages + hash.to_a).map { |msg| send(*msg.is_a?(::Array) ? msg : [msg]) }
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
#--
|
|
2
|
+
###############################################################################
|
|
3
|
+
# #
|
|
4
|
+
# nuggets -- Extending Ruby #
|
|
5
|
+
# #
|
|
6
|
+
# Copyright (C) 2007-2011 Jens Wille #
|
|
7
|
+
# #
|
|
8
|
+
# Authors: #
|
|
9
|
+
# Jens Wille <jens.wille@gmail.com> #
|
|
10
|
+
# #
|
|
11
|
+
# nuggets is free software; you can redistribute it and/or modify it under #
|
|
12
|
+
# the terms of the GNU Affero General Public License as published by the Free #
|
|
13
|
+
# Software Foundation; either version 3 of the License, or (at your option) #
|
|
14
|
+
# any later version. #
|
|
15
|
+
# #
|
|
16
|
+
# nuggets is distributed in the hope that it will be useful, but WITHOUT ANY #
|
|
17
|
+
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS #
|
|
18
|
+
# FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for #
|
|
19
|
+
# more details. #
|
|
20
|
+
# #
|
|
21
|
+
# You should have received a copy of the GNU Affero General Public License #
|
|
22
|
+
# along with nuggets. If not, see <http://www.gnu.org/licenses/>. #
|
|
23
|
+
# #
|
|
24
|
+
###############################################################################
|
|
25
|
+
#++
|
|
26
|
+
|
|
27
|
+
module Nuggets
|
|
28
|
+
class Object
|
|
29
|
+
module SilenceMixin
|
|
30
|
+
|
|
31
|
+
# call-seq:
|
|
32
|
+
# silence { ... }
|
|
33
|
+
#
|
|
34
|
+
# Silence warnings for block execution.
|
|
35
|
+
def silence
|
|
36
|
+
verbose, $VERBOSE = $VERBOSE, nil
|
|
37
|
+
yield
|
|
38
|
+
ensure
|
|
39
|
+
$VERBOSE = verbose
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
#--
|
|
2
|
+
###############################################################################
|
|
3
|
+
# #
|
|
4
|
+
# nuggets -- Extending Ruby #
|
|
5
|
+
# #
|
|
6
|
+
# Copyright (C) 2007-2011 Jens Wille #
|
|
7
|
+
# #
|
|
8
|
+
# Authors: #
|
|
9
|
+
# Jens Wille <jens.wille@gmail.com> #
|
|
10
|
+
# #
|
|
11
|
+
# nuggets is free software; you can redistribute it and/or modify it under #
|
|
12
|
+
# the terms of the GNU Affero General Public License as published by the Free #
|
|
13
|
+
# Software Foundation; either version 3 of the License, or (at your option) #
|
|
14
|
+
# any later version. #
|
|
15
|
+
# #
|
|
16
|
+
# nuggets is distributed in the hope that it will be useful, but WITHOUT ANY #
|
|
17
|
+
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS #
|
|
18
|
+
# FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for #
|
|
19
|
+
# more details. #
|
|
20
|
+
# #
|
|
21
|
+
# You should have received a copy of the GNU Affero General Public License #
|
|
22
|
+
# along with nuggets. If not, see <http://www.gnu.org/licenses/>. #
|
|
23
|
+
# #
|
|
24
|
+
###############################################################################
|
|
25
|
+
#++
|
|
26
|
+
|
|
27
|
+
module Nuggets
|
|
28
|
+
class Object
|
|
29
|
+
module SingletonClassMixin
|
|
30
|
+
|
|
31
|
+
# call-seq:
|
|
32
|
+
# object.singleton_class => aClass
|
|
33
|
+
#
|
|
34
|
+
# Returns the singleton (or virtual/eigen/meta) class associated with _object_.
|
|
35
|
+
def singleton_class
|
|
36
|
+
class << self; self; end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
alias_method :virtual_class, :singleton_class
|
|
40
|
+
alias_method :ghost_class, :singleton_class
|
|
41
|
+
alias_method :eigenclass, :singleton_class
|
|
42
|
+
alias_method :metaclass, :singleton_class
|
|
43
|
+
alias_method :uniclass, :singleton_class
|
|
44
|
+
|
|
45
|
+
# call-seq:
|
|
46
|
+
# object.singleton_object => anObject
|
|
47
|
+
#
|
|
48
|
+
# Returns the object of which _object_ is the singleton_class.
|
|
49
|
+
# Raises a TypeError if _object_ is not a singleton class.
|
|
50
|
+
def singleton_object
|
|
51
|
+
[true, false, nil].each { |obj|
|
|
52
|
+
return obj if self.equal?(obj.singleton_class)
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
# raises TypeError if neither class nor module
|
|
56
|
+
::ObjectSpace.each_object(self) { |obj|
|
|
57
|
+
return obj if self.equal?(obj.singleton_class)
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
# if we got here, it can't be a singleton class
|
|
61
|
+
# or its singleton object doesn't exist anymore
|
|
62
|
+
raise ::TypeError
|
|
63
|
+
rescue ::TypeError
|
|
64
|
+
raise ::TypeError, 'not a singleton class'
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
alias_method :virtual_object, :singleton_object
|
|
68
|
+
alias_method :ghost_object, :singleton_object
|
|
69
|
+
alias_method :eigenobject, :singleton_object
|
|
70
|
+
alias_method :metaobject, :singleton_object
|
|
71
|
+
alias_method :uniobject, :singleton_object
|
|
72
|
+
|
|
73
|
+
alias_method :singleton_instance, :singleton_object
|
|
74
|
+
|
|
75
|
+
# call-seq:
|
|
76
|
+
# object.singleton_class? => +true+ or +false+
|
|
77
|
+
#
|
|
78
|
+
# Returns +true+ if _object_ is a singleton_class
|
|
79
|
+
# (i.e., has a singleton_object), +false+ otherwise.
|
|
80
|
+
def singleton_class?
|
|
81
|
+
singleton_object
|
|
82
|
+
true
|
|
83
|
+
rescue ::TypeError
|
|
84
|
+
false
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
alias_method :virtual_class?, :singleton_class?
|
|
88
|
+
alias_method :ghost_class?, :singleton_class?
|
|
89
|
+
alias_method :eigenclass?, :singleton_class?
|
|
90
|
+
alias_method :metaclass?, :singleton_class?
|
|
91
|
+
alias_method :uniclass?, :singleton_class?
|
|
92
|
+
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
end
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
#--
|
|
2
|
+
###############################################################################
|
|
3
|
+
# #
|
|
4
|
+
# nuggets -- Extending Ruby #
|
|
5
|
+
# #
|
|
6
|
+
# Copyright (C) 2007-2011 Jens Wille #
|
|
7
|
+
# #
|
|
8
|
+
# Authors: #
|
|
9
|
+
# Jens Wille <jens.wille@gmail.com> #
|
|
10
|
+
# #
|
|
11
|
+
# nuggets is free software; you can redistribute it and/or modify it under #
|
|
12
|
+
# the terms of the GNU Affero General Public License as published by the Free #
|
|
13
|
+
# Software Foundation; either version 3 of the License, or (at your option) #
|
|
14
|
+
# any later version. #
|
|
15
|
+
# #
|
|
16
|
+
# nuggets is distributed in the hope that it will be useful, but WITHOUT ANY #
|
|
17
|
+
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS #
|
|
18
|
+
# FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for #
|
|
19
|
+
# more details. #
|
|
20
|
+
# #
|
|
21
|
+
# You should have received a copy of the GNU Affero General Public License #
|
|
22
|
+
# along with nuggets. If not, see <http://www.gnu.org/licenses/>. #
|
|
23
|
+
# #
|
|
24
|
+
###############################################################################
|
|
25
|
+
#++
|
|
26
|
+
|
|
27
|
+
require 'set'
|
|
28
|
+
|
|
29
|
+
module Nuggets
|
|
30
|
+
module Pluggable
|
|
31
|
+
|
|
32
|
+
def self.load_plugins_for(*klasses)
|
|
33
|
+
klasses.map { |klass| klass.extend(self).load_plugins }
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def load_plugins(name = plugin_filename)
|
|
37
|
+
load_path_plugins(name)
|
|
38
|
+
load_gem_plugins(name)
|
|
39
|
+
load_env_plugins(name)
|
|
40
|
+
|
|
41
|
+
loaded_plugins.to_a
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def loaded_plugins
|
|
45
|
+
@loaded_plugins ||= Set.new
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def plugin_filename
|
|
49
|
+
@plugin_filename ||= "#{name.
|
|
50
|
+
gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2').
|
|
51
|
+
gsub(/([a-z\d])([A-Z])/, '\1_\2').
|
|
52
|
+
gsub(/::/, '/').tr('-', '_').downcase}_plugin.rb"
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
attr_writer :plugin_filename
|
|
56
|
+
|
|
57
|
+
private
|
|
58
|
+
|
|
59
|
+
def load_path_plugins(name)
|
|
60
|
+
$LOAD_PATH.dup.each { |path|
|
|
61
|
+
plugin = ::File.expand_path(name, path)
|
|
62
|
+
load_plugin_file(plugin) if ::File.file?(plugin)
|
|
63
|
+
}
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def load_gem_plugins(name)
|
|
67
|
+
::Gem::Specification.latest_specs.each { |spec|
|
|
68
|
+
load_plugin_files(spec.matches_for_glob(name))
|
|
69
|
+
} if ::Object.const_defined?(:Gem)
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def load_env_plugins(name)
|
|
73
|
+
path = ::ENV["#{name.chomp(ext = ::File.extname(name)).upcase}_PATH"]
|
|
74
|
+
path.split(::File::PATH_SEPARATOR).each { |dir|
|
|
75
|
+
load_plugin_files(::Dir["#{dir}/*#{ext}"])
|
|
76
|
+
} if path
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def load_plugin_file(plugin)
|
|
80
|
+
load plugin if loaded_plugins.add?(plugin)
|
|
81
|
+
rescue ::Exception => err
|
|
82
|
+
raise unless loaded_plugins.delete?(plugin)
|
|
83
|
+
warn "Error loading #{name} plugin: #{plugin}: #{err} (#{err.class})"
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def load_plugin_files(plugins)
|
|
87
|
+
plugins.each { |plugin| load_plugin_file(::File.expand_path(plugin)) }
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
end
|
|
91
|
+
end
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
#--
|
|
2
|
+
###############################################################################
|
|
3
|
+
# #
|
|
4
|
+
# nuggets -- Extending Ruby #
|
|
5
|
+
# #
|
|
6
|
+
# Copyright (C) 2007-2011 Jens Wille #
|
|
7
|
+
# #
|
|
8
|
+
# Authors: #
|
|
9
|
+
# Jens Wille <jens.wille@gmail.com> #
|
|
10
|
+
# #
|
|
11
|
+
# nuggets is free software; you can redistribute it and/or modify it under #
|
|
12
|
+
# the terms of the GNU Affero General Public License as published by the Free #
|
|
13
|
+
# Software Foundation; either version 3 of the License, or (at your option) #
|
|
14
|
+
# any later version. #
|
|
15
|
+
# #
|
|
16
|
+
# nuggets is distributed in the hope that it will be useful, but WITHOUT ANY #
|
|
17
|
+
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS #
|
|
18
|
+
# FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for #
|
|
19
|
+
# more details. #
|
|
20
|
+
# #
|
|
21
|
+
# You should have received a copy of the GNU Affero General Public License #
|
|
22
|
+
# along with nuggets. If not, see <http://www.gnu.org/licenses/>. #
|
|
23
|
+
# #
|
|
24
|
+
###############################################################################
|
|
25
|
+
#++
|
|
26
|
+
|
|
27
|
+
module Nuggets
|
|
28
|
+
class Proc
|
|
29
|
+
module BindMixin
|
|
30
|
+
|
|
31
|
+
# call-seq:
|
|
32
|
+
# proc.bind(object) => aMethod
|
|
33
|
+
#
|
|
34
|
+
# Straight from Rails' ActiveSupport -- effectively binds _proc_ to +object+.
|
|
35
|
+
def bind(object)
|
|
36
|
+
block, time = self, ::Time.now
|
|
37
|
+
|
|
38
|
+
(class << object; self; end).class_eval {
|
|
39
|
+
method_name = "__bind_#{time.to_i}_#{time.usec}"
|
|
40
|
+
define_method(method_name, &block)
|
|
41
|
+
|
|
42
|
+
method = instance_method(method_name)
|
|
43
|
+
remove_method(method_name)
|
|
44
|
+
|
|
45
|
+
method
|
|
46
|
+
}.bind(object)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|