quality_extensions 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (100) hide show
  1. data/Readme +54 -0
  2. data/lib/qualitysmith_extensions/all.rb +4 -0
  3. data/lib/qualitysmith_extensions/array/all.rb +2 -0
  4. data/lib/qualitysmith_extensions/array/average.rb +44 -0
  5. data/lib/qualitysmith_extensions/array/classify.rb +97 -0
  6. data/lib/qualitysmith_extensions/array/expand_ranges.rb +52 -0
  7. data/lib/qualitysmith_extensions/array/group_by.rb +134 -0
  8. data/lib/qualitysmith_extensions/array/sequence.rb +66 -0
  9. data/lib/qualitysmith_extensions/array/shell_escape.rb +36 -0
  10. data/lib/qualitysmith_extensions/array/to_a_recursive.rb +41 -0
  11. data/lib/qualitysmith_extensions/array/to_query_string.rb +96 -0
  12. data/lib/qualitysmith_extensions/collection_extensions_for_cgi.rb +2 -0
  13. data/lib/qualitysmith_extensions/colored/toggleability.rb +62 -0
  14. data/lib/qualitysmith_extensions/console/command.facets.1.8.51.rb +749 -0
  15. data/lib/qualitysmith_extensions/console/command.facets.1.8.54.rb +748 -0
  16. data/lib/qualitysmith_extensions/console/command.rb +944 -0
  17. data/lib/qualitysmith_extensions/date/all.rb +2 -0
  18. data/lib/qualitysmith_extensions/date/deprecated.rb +40 -0
  19. data/lib/qualitysmith_extensions/date/iso8601.rb +31 -0
  20. data/lib/qualitysmith_extensions/date/month_ranges.rb +122 -0
  21. data/lib/qualitysmith_extensions/dir/each_child.rb +58 -0
  22. data/lib/qualitysmith_extensions/enumerable/enum.rb +69 -0
  23. data/lib/qualitysmith_extensions/enumerable/select_until.rb +4 -0
  24. data/lib/qualitysmith_extensions/enumerable/select_while.rb +109 -0
  25. data/lib/qualitysmith_extensions/exception/inspect_with_backtrace.rb +65 -0
  26. data/lib/qualitysmith_extensions/file/exact_match_regexp.rb +34 -0
  27. data/lib/qualitysmith_extensions/file_test/binary_file.rb +110 -0
  28. data/lib/qualitysmith_extensions/find/select.rb +68 -0
  29. data/lib/qualitysmith_extensions/global_variable_set.rb +153 -0
  30. data/lib/qualitysmith_extensions/hash/all.rb +2 -0
  31. data/lib/qualitysmith_extensions/hash/to_date.rb +34 -0
  32. data/lib/qualitysmith_extensions/hash/to_query_string.rb +121 -0
  33. data/lib/qualitysmith_extensions/kernel/all.rb +2 -0
  34. data/lib/qualitysmith_extensions/kernel/autoreload.rb +128 -0
  35. data/lib/qualitysmith_extensions/kernel/backtrace.rb +71 -0
  36. data/lib/qualitysmith_extensions/kernel/capture_output.rb +115 -0
  37. data/lib/qualitysmith_extensions/kernel/die.rb +49 -0
  38. data/lib/qualitysmith_extensions/kernel/example_printer.rb +81 -0
  39. data/lib/qualitysmith_extensions/kernel/filter_output.rb +108 -0
  40. data/lib/qualitysmith_extensions/kernel/remove_const.rb +178 -0
  41. data/lib/qualitysmith_extensions/kernel/remove_module.rb +127 -0
  42. data/lib/qualitysmith_extensions/kernel/require_all.rb +186 -0
  43. data/lib/qualitysmith_extensions/kernel/require_local_all.rb +4 -0
  44. data/lib/qualitysmith_extensions/kernel/require_once.rb +18 -0
  45. data/lib/qualitysmith_extensions/kernel/simulate_input.rb +52 -0
  46. data/lib/qualitysmith_extensions/kernel/trap_chain.rb +61 -0
  47. data/lib/qualitysmith_extensions/kernel/windows_platform.rb +46 -0
  48. data/lib/qualitysmith_extensions/module/alias_method.rb +6 -0
  49. data/lib/qualitysmith_extensions/module/alias_method_chain.rb +165 -0
  50. data/lib/qualitysmith_extensions/module/ancestry_of_instance_method.rb +43 -0
  51. data/lib/qualitysmith_extensions/module/attribute_accessors.rb +49 -0
  52. data/lib/qualitysmith_extensions/module/basename.rb +76 -0
  53. data/lib/qualitysmith_extensions/module/bool_attr_accessor.rb +497 -0
  54. data/lib/qualitysmith_extensions/module/class_methods.rb +87 -0
  55. data/lib/qualitysmith_extensions/module/create.rb +315 -0
  56. data/lib/qualitysmith_extensions/module/create_setter.rb +9 -0
  57. data/lib/qualitysmith_extensions/module/dirname.rb +4 -0
  58. data/lib/qualitysmith_extensions/module/guard_method.rb +312 -0
  59. data/lib/qualitysmith_extensions/module/includable_once.rb +10 -0
  60. data/lib/qualitysmith_extensions/module/join.rb +66 -0
  61. data/lib/qualitysmith_extensions/module/malias_method_chain.rb +92 -0
  62. data/lib/qualitysmith_extensions/module/module_methods.rb +4 -0
  63. data/lib/qualitysmith_extensions/module/namespace.rb +112 -0
  64. data/lib/qualitysmith_extensions/module/parents.rb +61 -0
  65. data/lib/qualitysmith_extensions/module/remove_const.rb +117 -0
  66. data/lib/qualitysmith_extensions/module/split.rb +55 -0
  67. data/lib/qualitysmith_extensions/month.rb +66 -0
  68. data/lib/qualitysmith_extensions/mutex/if_available.rb +75 -0
  69. data/lib/qualitysmith_extensions/object/ancestry_of_method.rb +257 -0
  70. data/lib/qualitysmith_extensions/object/default.rb +69 -0
  71. data/lib/qualitysmith_extensions/object/if_else.rb +157 -0
  72. data/lib/qualitysmith_extensions/object/ignore_access.rb +84 -0
  73. data/lib/qualitysmith_extensions/object/mcall.rb +92 -0
  74. data/lib/qualitysmith_extensions/object/methods.rb +63 -0
  75. data/lib/qualitysmith_extensions/object/send_if.rb +151 -0
  76. data/lib/qualitysmith_extensions/object/send_if_not_nil.rb +35 -0
  77. data/lib/qualitysmith_extensions/object/singleton_send.rb +129 -0
  78. data/lib/qualitysmith_extensions/regexp/join.rb +111 -0
  79. data/lib/qualitysmith_extensions/string/all.rb +2 -0
  80. data/lib/qualitysmith_extensions/string/constantize.rb +4 -0
  81. data/lib/qualitysmith_extensions/string/digits_only.rb +27 -0
  82. data/lib/qualitysmith_extensions/string/each_char_with_index.rb +41 -0
  83. data/lib/qualitysmith_extensions/string/md5.rb +29 -0
  84. data/lib/qualitysmith_extensions/string/shell_escape.rb +43 -0
  85. data/lib/qualitysmith_extensions/string/to_underscored_label.rb +37 -0
  86. data/lib/qualitysmith_extensions/string/with_knowledge_of_color.rb +64 -0
  87. data/lib/qualitysmith_extensions/symbol/constantize.rb +69 -0
  88. data/lib/qualitysmith_extensions/symbol/match.rb +157 -0
  89. data/lib/qualitysmith_extensions/template.rb +33 -0
  90. data/lib/qualitysmith_extensions/test/all.rb +2 -0
  91. data/lib/qualitysmith_extensions/test/assert_anything.rb +93 -0
  92. data/lib/qualitysmith_extensions/test/assert_changed.rb +66 -0
  93. data/lib/qualitysmith_extensions/test/assert_exception.rb +66 -0
  94. data/lib/qualitysmith_extensions/test/assert_includes.rb +36 -0
  95. data/lib/qualitysmith_extensions/test/assert_user_error.rb +37 -0
  96. data/lib/qualitysmith_extensions/test/difference_highlighting.rb +323 -0
  97. data/lib/qualitysmith_extensions/time/all.rb +2 -0
  98. data/lib/qualitysmith_extensions/time/deprecated.rb +31 -0
  99. data/test/all.rb +16 -0
  100. metadata +148 -0
@@ -0,0 +1,55 @@
1
+ #--
2
+ # Author:: Tyler Rick
3
+ # Copyright:: Copyright (c) 2007 QualitySmith, Inc.
4
+ # License:: Ruby License
5
+ # Submit to Facets?:: Yes!
6
+ # Developer notes::
7
+ #++
8
+
9
+ require 'rubygems'
10
+ require 'facets/core/symbol/to_proc'
11
+
12
+ class Module
13
+ # Very similar to Facets' +Module#nesting+, but, whereas +nesting+ will break <tt>A::B</tt> into an array of _constants_ represting nesting
14
+ # (<tt>[A, A::B]</tt>), this method will split it into an array of _symbols_: <tt>[:A, :B]</tt>.
15
+ #
16
+ # Note that the second element in this array, <tt>:B</tt>, is _not_ fully qualified, so you could not do a <tt>const_get</tt>
17
+ # on that symbol.
18
+ def split
19
+ name.split(/::/).map(&:to_sym)
20
+ end
21
+
22
+ # Like Module#split, only this operates on a string/symbol. Useful for when you don't want to or can't actually instantiate
23
+ # the module represented by the symbol.
24
+ def self.split_name(name)
25
+ name.to_s.split(/::/).map(&:to_sym)
26
+ end
27
+ end
28
+
29
+
30
+ # _____ _
31
+ # |_ _|__ ___| |_
32
+ # | |/ _ \/ __| __|
33
+ # | | __/\__ \ |_
34
+ # |_|\___||___/\__|
35
+ #
36
+ =begin test
37
+ require 'test/unit'
38
+
39
+ module A
40
+ module B
41
+ end
42
+ end
43
+
44
+ class TheTest < Test::Unit::TestCase
45
+ def test_A
46
+ assert_equal [:A], A.split
47
+ end
48
+ def test_A_B
49
+ assert_equal [:A, :B], A::B.split
50
+ end
51
+
52
+ end
53
+ =end
54
+
55
+
@@ -0,0 +1,66 @@
1
+ #--
2
+ # Author:: Tyler Rick
3
+ # Copyright:: Copyright (c) 2007 QualitySmith, Inc.
4
+ # License:: Ruby License
5
+ # Submit to Facets?:: Not sure. Who really cares about Months anyway?
6
+ # Developer notes::
7
+ # * Compare with http://rubyforge.org/projects/dateutils/. Merge/abandon?
8
+ #++
9
+
10
+ require "rubygems"
11
+ require "active_support"
12
+ require File.dirname(__FILE__) + "/date/all"
13
+
14
+ class Month
15
+ include Comparable
16
+ attr_reader :year, :month
17
+
18
+ def initialize(year, month)
19
+ @year = year
20
+ @month = month
21
+ end
22
+
23
+ def succ
24
+ (to_date >> 1).to_month
25
+ end
26
+
27
+ def to_date
28
+ Date.new(year, month)
29
+ end
30
+
31
+ def <=>(other)
32
+ #puts "#{self.inspect} <=> #{other.inspect}"
33
+ return self.to_date <=> other.to_date
34
+ end
35
+
36
+ def inspect
37
+ "#{@year}-#{@month}"
38
+ end
39
+ end
40
+
41
+
42
+ # _____ _
43
+ # |_ _|__ ___| |_
44
+ # | |/ _ \/ __| __|
45
+ # | | __/\__ \ |_
46
+ # |_|\___||___/\__|
47
+ #
48
+ =begin test
49
+ class TheTest < Test::Unit::TestCase
50
+ def test_months_range
51
+ range = Month.new(2006, 6)..Month.new(2006, 9)
52
+ assert_equal Range.new(Month.new(2006, 6), Month.new(2006, 9)), range
53
+
54
+ range = Date.new(2006, 6, 1).to_month..Date.new(2006, 9, 3).to_month
55
+ assert_equal Range.new(Month.new(2006, 6), Month.new(2006, 9)), range
56
+
57
+ assert_equal [
58
+ Month.new(2006, 6),
59
+ Month.new(2006, 7),
60
+ Month.new(2006, 8),
61
+ Month.new(2006, 9)
62
+ ],
63
+ range.to_a
64
+ end
65
+ end
66
+ =end
@@ -0,0 +1,75 @@
1
+ #--
2
+ # Author:: Nolan Cafferky
3
+ # Copyright:: Copyright (c) 2007 QualitySmith, Inc.
4
+ # License:: Ruby License
5
+ # Submit to Facets?:: Yes.
6
+ #++
7
+
8
+ require 'thread'
9
+ class Mutex
10
+ # Acts like synchronize, except that if the lock cannot be acquired immediately,
11
+ # the program continues without executing the given block.
12
+ #
13
+ # ==Example:
14
+ #
15
+ # mutex = Mutex.new
16
+ # # ...
17
+ # mutex.if_available do
18
+ # # Some process that we only want one thread to be running at a time,
19
+ # # and we don't mind skipping if some other thread is already doing it.
20
+ # loop do
21
+ # notify_mechanics if danger_to_teh_manifold!
22
+ # sleep 60
23
+ # end
24
+ # end
25
+ def if_available
26
+ if try_lock
27
+ begin
28
+ yield
29
+ ensure
30
+ unlock
31
+ end
32
+ end
33
+ end
34
+ end
35
+
36
+
37
+
38
+ # _____ _
39
+ # |_ _|__ ___| |_
40
+ # | |/ _ \/ __| __|
41
+ # | | __/\__ \ |_
42
+ # |_|\___||___/\__|
43
+ #
44
+ =begin test
45
+ class TheTest < Test::Unit::TestCase
46
+ def setup
47
+ @semaphore = Mutex.new
48
+ end
49
+
50
+ def teardown
51
+ end
52
+
53
+ def test_executes_if_lock_is_available
54
+ i_ran = nil
55
+
56
+ @semaphore.if_available do
57
+ i_ran = true
58
+ end
59
+
60
+ assert i_ran
61
+ end
62
+
63
+ def test_continues_if_lock_is_unavailable
64
+ i_ran = nil
65
+
66
+ @semaphore.lock
67
+ @semaphore.if_available do
68
+ i_ran = true
69
+ end
70
+ @semaphore.unlock
71
+
72
+ assert_nil i_ran
73
+ end
74
+ end
75
+ =end
@@ -0,0 +1,257 @@
1
+ #--
2
+ # Author:: Tyler Rick
3
+ # Copyright:: Copyright (c) 2007 QualitySmith, Inc.
4
+ # License:: Ruby License
5
+ # Submit to Facets?:: Yes.
6
+ # Developer notes::
7
+ # * May not have taken every single case into consideration. Needs a bit more testing.
8
+ # * public/private/protected?
9
+ # * Rename to origin_of_method (or source_of_method)?? Since strictly speaking it may return a method that is not from any *ancestors* but is from the Class class.
10
+ #++
11
+
12
+ require 'rubygems'
13
+ require 'qualitysmith_extensions/module/class_methods'
14
+ require 'qualitysmith_extensions/module/ancestry_of_instance_method'
15
+
16
+
17
+ class Object
18
+ # Returns the module/class which defined the given method. If more than one module/class defined the method, returns the _closest_
19
+ # ancestor to have defined it (would be +self+ if it is defined in +self+).
20
+ #
21
+ # This is (as far as I know -- patches welcome) <b>the method that would _would_ be called if you actually called the method</b>.
22
+ # So if you override
23
+ #
24
+ # It does this by first checking
25
+ # searching the methods defined in each ancestor in turn (in the order that <tt>self.ancestors</tt> returns them) and
26
+ # returning the first module/class that satisfies the search.
27
+ #
28
+ # This looks at the results of <tt>methods</tt>, which means that if you call this on a module/class, it will _not_ return
29
+ # any instance methods, only _class_ methods.
30
+ #
31
+ # class Base
32
+ # def self.it; end
33
+ # end
34
+ # class SubWithIt < Base
35
+ # def self.it; end
36
+ # end
37
+ # class SubWithoutIt < Base
38
+ # end
39
+ # SubWithIt.ancestry_of_instance_method(:it) # => SubWithIt # (Stops with self)
40
+ # SubWithoutIt.ancestry_of_instance_method(:it) # => Base # (Goes one step up the ancestry tree)
41
+ #
42
+ # If you call this on an object that is _not_ a module or a class (in other words, if you call it on an _instance_ of some
43
+ # class), then it will assume you actually want to know about an _instance_ method defined in self.class or one of the
44
+ # ancestors of self.class. (Since non-modules don't even technically have the concept of _ancestors_.) Therefore, this:
45
+ # class Klass
46
+ # def it; end
47
+ # end
48
+ # o = Klass.new
49
+ # o.ancestry_of_method(:it) # => Klass
50
+ # is really just a shorthand way of doing:
51
+ # o.class.ancestry_of_instance_method(:it) # => Klass
52
+ #
53
+ # If the method is a singleton method of +self+, it will return +self+:
54
+ # class << (foo = SubWithIt.new)
55
+ # def it; end
56
+ # end
57
+ # foo.ancestry_of_method(:it) # => #<SubWithIt:0xb7e5614c>
58
+ #
59
+ # Returns nil if it cannot be found in self or in any ancestor.
60
+ def ancestry_of_method(method_name)
61
+ method_name = method_name.to_s
62
+ (self if self.methods(false).include?(method_name)) \
63
+ ||
64
+ if self.is_a?(Module)
65
+ self.ancestors.find do |ancestor|
66
+ ancestor.methods(false).include? method_name
67
+ end or
68
+ # The above search does not take into account *instance* methods provided by Class, Module, or Kernel.
69
+ # Remember that ancestors and instances/class/superclass are different concepts, and that although classes/modules
70
+ # do not have Class or Module as an "ancestor", they are still *instances* of Module or Class (which is a subclass of module).
71
+ # self.ancestors does NOT include Class or Module, and yet we're still able to "inherit" instance methods from Class or Module.
72
+ # So we have to do this extra search in case the method came from one of the instance methods of Class or Module or Kernel
73
+ # (are there any other cases I'm missing?).
74
+ begin
75
+ # self.class.ancestors is usually [Class, Module, Object, PP::ObjectMixin, Kernel]
76
+ self.class.ancestors.find do |ancestor|
77
+ ancestor.instance_methods(false).include? method_name
78
+ # || ancestor.private_instance_method_defined?( method_name.to_sym )
79
+ end
80
+ end
81
+ else
82
+ self.class.ancestry_of_instance_method(method_name)
83
+ end
84
+ end
85
+ end
86
+
87
+ # _____ _
88
+ # |_ _|__ ___| |_
89
+ # | |/ _ \/ __| __|
90
+ # | | __/\__ \ |_
91
+ # |_|\___||___/\__|
92
+ #
93
+ =begin test
94
+ require 'test/unit'
95
+ require 'rubygems'
96
+ require 'qualitysmith_extensions/test/assert_anything'
97
+
98
+ class Base
99
+ def it; end
100
+ end
101
+ class SubWithIt < Base
102
+ def it; end
103
+ end
104
+ class SubWithoutIt < Base
105
+ end
106
+
107
+ class << ($with_singleton_method = SubWithIt.new)
108
+ def it; end
109
+ end
110
+
111
+ class ClassyBase
112
+ def self.classy_it; end
113
+ end
114
+ class ClassySubWithIt < ClassyBase
115
+ def self.classy_it; end
116
+ end
117
+ class ClassySubWithoutIt < ClassyBase
118
+ end
119
+
120
+ class << ($class_with_singleton_method = ClassySubWithIt)
121
+ def classy_it; end
122
+ end
123
+
124
+ class ATest < Test::Unit::TestCase
125
+ def test_non_existent_method
126
+ assert_equal nil, Base.ancestry_of_method(:not_a_method)
127
+ assert_equal nil, Base.ancestry_of_instance_method(:not_a_method)
128
+ end
129
+ end
130
+
131
+ class InstanceMethodsTest < Test::Unit::TestCase
132
+ def test_1
133
+ assert_equal [SubWithoutIt, Base, Object, PP::ObjectMixin, Kernel], SubWithoutIt.ancestors
134
+ assert_equal Base, Base.ancestry_of_instance_method(:it)
135
+ assert_equal Base, SubWithoutIt.ancestry_of_instance_method(:it)
136
+ assert_equal SubWithIt, SubWithIt.ancestry_of_instance_method(:it)
137
+ assert_equal SubWithIt, SubWithIt.ancestry_of_instance_method(:it)
138
+ end
139
+ def test_ancestry_of_method__falls_back_to_using__ancestry_of_instance_method__if_is_an_instance
140
+ assert_include? Base.instance_methods, :it.to_s
141
+ assert_equal Base, Base.new.ancestry_of_method(:it)
142
+ assert_equal Base, SubWithoutIt.new.ancestry_of_method(:it)
143
+ assert_equal SubWithIt, SubWithIt.new.ancestry_of_method(:it)
144
+
145
+ # In other words, it's a *shortcut*. See?:
146
+ o = SubWithIt.new
147
+ assert_equal o.class.ancestry_of_instance_method(:it), o.ancestry_of_method(:it)
148
+ end
149
+ def test_singleton_method
150
+ assert_equal $with_singleton_method, $with_singleton_method.ancestry_of_method(:it)
151
+ end
152
+ def test_that_you_cant_use_ancestry_of_instance_method_for_instances
153
+ # undefined method `ancestors' for #<SubWithIt:0xb7e0fbc0>
154
+ assert_raise(NoMethodError) { SubWithIt.new.ancestry_of_instance_method(:it) }
155
+ assert_raise(NoMethodError) { $with_singleton_method.ancestry_of_instance_method(:it) }
156
+ end
157
+ end
158
+ class ClassMethodsTest < Test::Unit::TestCase
159
+ def test_ancestry_of_method_doesnt_return_instance_methods
160
+ assert_include? Base.instance_methods, :it.to_s
161
+ assert_not_include? Base.methods, :it.to_s
162
+
163
+ assert_equal [SubWithoutIt, Base, Object, PP::ObjectMixin, Kernel], SubWithoutIt.ancestors
164
+
165
+ assert_equal nil, Base.ancestry_of_method(:it)
166
+ assert_equal nil, SubWithoutIt.ancestry_of_method(:it)
167
+ assert_equal nil, SubWithIt.ancestry_of_method(:it)
168
+ end
169
+ def test_ancestry_of_method_does_return_class_methods
170
+ assert_include? ClassyBase.methods, :classy_it.to_s
171
+ assert_not_include? ClassyBase.instance_methods, :classy_it.to_s
172
+
173
+ assert_equal [ClassySubWithoutIt, ClassyBase, Object, PP::ObjectMixin, Kernel], ClassySubWithoutIt.ancestors
174
+
175
+ assert_equal ClassyBase, ClassySubWithoutIt.ancestry_of_method(:classy_it)
176
+ assert_equal ClassyBase, ClassyBase.ancestry_of_method(:classy_it)
177
+ assert_equal ClassySubWithIt, ClassySubWithIt.ancestry_of_method(:classy_it)
178
+ end
179
+ def test_singleton_method
180
+ assert_equal $class_with_singleton_method, $class_with_singleton_method.ancestry_of_method(:classy_it)
181
+ assert_equal nil, $class_with_singleton_method.ancestry_of_instance_method(:classy_it)
182
+ end
183
+ end
184
+
185
+ class BuiltInMethodsTest < Test::Unit::TestCase
186
+ def test_1
187
+ assert_equal [Object, PP::ObjectMixin, Kernel], Object.ancestors
188
+ assert_equal Kernel, Object.ancestry_of_method(:binding)
189
+ assert_equal Kernel, Object.ancestry_of_method(:require)
190
+ assert_equal Kernel, Object.ancestry_of_method(:proc)
191
+ end
192
+
193
+ def test_looks_at_Class_Module_and_Kernel_instance_methods_if_necessary
194
+ # Sometimes it inherits a method NOT from any of its ancestors, but from Class (one of the *instance methods* of Class).
195
+
196
+ # (Class is *not* an ancestor of Object and yet that appears to be where these methods come from.)
197
+ assert_not_include? Object.ancestors, Class
198
+ assert_equal Class, Object.class
199
+ [
200
+ :superclass,
201
+ :new,
202
+ :allocate,
203
+ ].each do |method|
204
+ assert_ancestry_of_method_is Object, method, Class
205
+ end
206
+
207
+ # superclass (and others) comes from Class, but instance_variable_get (and others) come from Module or Kernel.
208
+ # (See below for more examples)
209
+ assert_equal true, Class.instance_methods(false).include?('superclass')
210
+ assert_equal false, Class.instance_methods(false).include?('instance_variable_get')
211
+ assert_equal true, Kernel.instance_methods(false).include?('instance_variable_get')
212
+
213
+ # (Module is *not* an ancestor of Object and yet that appears to be where these methods come from.)
214
+ assert_not_include? Object.ancestors, Module
215
+ [
216
+ :instance_methods,
217
+ :included_modules,
218
+ :constants,
219
+ :ancestors,
220
+ :public_method_defined?,
221
+ ].each do |method|
222
+ assert_equal Module, Object.ancestry_of_method(method), "Failed for #{method}"
223
+ end
224
+
225
+ # (Kernel *is* an ancestor of Object, but these methods come from Kernel.instance_methods and *not* from Kernel.methods.)
226
+ assert_include? Object.ancestors, Kernel
227
+ [
228
+ :puts,
229
+ :system,
230
+ :inspect,
231
+ :send,
232
+ :private_methods,
233
+ :instance_variable_get,
234
+ ].each do |method|
235
+ assert_equal Kernel, Object.ancestry_of_method(method)
236
+ end
237
+
238
+ # proc apparently comes from *class method* Kernel.proc,
239
+ # while instance_variable_get comes from *intance method* Kernel.instance_variable_get
240
+ assert_equal true, Kernel.class_methods(false).include?('proc')
241
+ assert_equal false, Kernel.instance_methods(false).include?('proc')
242
+ assert_equal false, Kernel.class_methods(false).include?('instance_variable_get')
243
+ assert_equal true, Kernel.instance_methods(false).include?('instance_variable_get')
244
+
245
+ # Where does this method come from then???
246
+ [
247
+ :remove_class_variable,
248
+ :remove_const,
249
+ :remove_method,
250
+ :undef_method,
251
+ :nesting,
252
+ ].each do |method|
253
+ assert_equal nil, Object.ancestry_of_method(method)
254
+ end
255
+ end
256
+ end
257
+ =end