quality_extensions 0.1.1

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.
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,81 @@
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
+ # * Can anyone think of a better name than put_statement?
8
+ # * Something more like xmp? sp? stp? xm? putst? -- Too cryptic?
9
+ # * verbose? -- too ambiguous (that could be the name for xmp, for example)
10
+ # * xmp: Do the set_trace_func trick that irb_xmp/of_caller both use... so that the user doesn't have to pass in the local binding manually...
11
+ # * Add class method for ExamplePrinter to set a template for use by xmp? So if you don't like the default ("=> #{result}"), you can specify your own...
12
+ #++
13
+
14
+ require 'rubygems'
15
+ #require 'facets/core/binding/self/of_caller'
16
+
17
+ # This was written because the irb/xmp that was already available seemed to be
18
+ # needlessly complex and needlessly dependent upon "irb" stuff. This
19
+ # alternative is dirt simple, and it still works.
20
+ module ExamplePrinter
21
+ # Prints the given statement (+code+ -- a string) before evaluating it.
22
+ # Same as xmp only it doesn't print the return value.
23
+ #
24
+ # o = nil
25
+ # xmp 'o = C.new', binding
26
+ # # => o = C.new
27
+ def put_statement(code, binding = nil, file = __FILE__, line = __LINE__)
28
+ # # This didn't work. Still got this error: undefined local variable or method `x' for #<TheTest:0xb7dbc358> (NameError)
29
+ # Binding.of_caller do |caller_binding|
30
+ # #puts caller_binding
31
+ # puts code
32
+ # eval code, caller_binding
33
+ # end
34
+ puts code
35
+ eval code, binding, file, line
36
+ end
37
+ alias_method :stp, :put_statement
38
+
39
+ # Prints the given statement (+code+ -- a string) before evaluating it. Then prints its return value.
40
+ # Pretty much compatible with irb/xmp. But you have currently have to pass
41
+ # in the binding manually if you have any local variables/methods that xmp
42
+ # should have access to.
43
+ def xmp(code, binding = nil)
44
+ result = put_statement(code, binding)
45
+ puts "=> #{result}"
46
+ end
47
+ end
48
+
49
+ include ExamplePrinter
50
+
51
+ # _____ _
52
+ # |_ _|__ ___| |_
53
+ # | |/ _ \/ __| __|
54
+ # | | __/\__ \ |_
55
+ # |_|\___||___/\__|
56
+ #
57
+ =begin test
58
+ require 'test/unit'
59
+ require 'rubygems'
60
+ gem 'qualitysmith_extensions'
61
+ require 'qualitysmith_extensions/kernel/capture_output'
62
+ require 'facets/core/string/margin'
63
+
64
+ class TheTest < Test::Unit::TestCase
65
+ def test_puts_statement
66
+ result = nil
67
+ x = 1
68
+ output = capture_output { result = put_statement("3 + x", binding) }
69
+ assert_equal 4, result
70
+ assert_equal "3 + x", output.chomp
71
+ end
72
+ def test_xmp
73
+ x = 1
74
+ output = capture_output { xmp("3 + x", binding) }
75
+ assert_equal <<-End.margin, output.chomp
76
+ |3 + x
77
+ |=> 4
78
+ End
79
+ end
80
+ end
81
+ =end
@@ -0,0 +1,108 @@
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 'stringio'
10
+
11
+ # Applies +filter+ to any $stderr output that +block+ tries to generate.
12
+ #
13
+ # +filter+ should be a Proc that accepts +attempted_output+ as its parameter and returns the string that should _actually_ be output.
14
+ #
15
+ # filter_stderr(lambda{''}) do
16
+ # noisy_command
17
+ # end
18
+ def filter_stderr(filter, &block)
19
+ old_stderr = $stderr
20
+ $stderr = StringIO.new
21
+ begin
22
+ yield
23
+ ensure
24
+ what_they_tried_to_output = $stderr.string
25
+ $stderr = old_stderr
26
+ $stderr.print filter.call(what_they_tried_to_output)
27
+ end
28
+ end
29
+ def filter_stdout(filter, &block)
30
+ old_stderr = $stdout
31
+ $stdout = StringIO.new
32
+ begin
33
+ yield
34
+ ensure
35
+ what_they_tried_to_output = $stdout.string
36
+ $stdout = old_stderr
37
+ $stdout.print filter.call(what_they_tried_to_output)
38
+ end
39
+ end
40
+
41
+ # _____ _
42
+ # |_ _|__ ___| |_
43
+ # | |/ _ \/ __| __|
44
+ # | | __/\__ \ |_
45
+ # |_|\___||___/\__|
46
+ #
47
+ =begin test
48
+ require 'test/unit'
49
+
50
+ # Not sure whether it's better to duplicate for increased readability here or metaprogram for decreased duplication...
51
+
52
+ # Duplicate for increased readability:
53
+ def noisy_command
54
+ $stderr.puts "Some annoying error message"
55
+ $stderr.puts "Some error message that we actually care to see"
56
+ end
57
+ class TheTest < Test::Unit::TestCase
58
+ def setup
59
+ $stderr = StringIO.new
60
+ end
61
+ def test_simple_filter
62
+ filter_stderr(lambda{|input| ''}) do
63
+ noisy_command
64
+ end
65
+ assert_equal '', $stderr.string
66
+ end
67
+ def test_sub_filter
68
+ filter_stderr(Proc.new { |attempted_output|
69
+ attempted_output.sub(/^Some annoying error message\n/, '')
70
+ }
71
+ ) do
72
+ noisy_command
73
+ end
74
+ assert_equal "Some error message that we actually care to see\n", $stderr.string
75
+ end
76
+ end
77
+
78
+ # Metaprogram for decreased duplication...
79
+ ['stdout', 'stderr'].each do |stream_name|
80
+ eval <<-End, binding, __FILE__, __LINE__+1
81
+ def noisy_command_#{stream_name}
82
+ $#{stream_name}.puts "Some annoying error message"
83
+ $#{stream_name}.puts "Some error message that we actually care to see"
84
+ end
85
+
86
+ class TheTest#{stream_name} < Test::Unit::TestCase
87
+ def setup
88
+ $#{stream_name} = StringIO.new
89
+ end
90
+ def test_simple_filter
91
+ filter_#{stream_name}(lambda{|input| ''}) do
92
+ noisy_command_#{stream_name}
93
+ end
94
+ assert_equal '', $#{stream_name}.string
95
+ end
96
+ def test_sub_filter
97
+ filter_#{stream_name}(Proc.new { |attempted_output|
98
+ attempted_output.sub(/^Some annoying error message\n/, '')
99
+ }
100
+ ) do
101
+ noisy_command_#{stream_name}
102
+ end
103
+ assert_equal "Some error message that we actually care to see\n", $#{stream_name}.string
104
+ end
105
+ end
106
+ End
107
+ end
108
+ =end
@@ -0,0 +1,178 @@
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 'qualitysmith_extensions/object/ignore_access'
11
+ require 'qualitysmith_extensions/module/split'
12
+ require 'facets/core/module/by_name'
13
+ require 'facets/core/module/modspace'
14
+
15
+ class Module
16
+ alias_method :remove_const_before_was_added_to_Kernel, :remove_const
17
+ end
18
+ module Kernel
19
+ # This is similar to the built-in <tt>Module#remove_const</tt>, but it is accessible from all "levels" (because it is defined
20
+ # in +Kernel+) and can handle hierarchy.
21
+ #
22
+ # Makes it possible to write simply:
23
+ # remove_const(A::B::C.name)
24
+ # rather than having to think about which module the constant is actually defined in and calling +remove_const+ on that module.
25
+ #
26
+ # This is how you would otherwise have to do it:
27
+ # A::B.send(:remove_const, :C)
28
+ #
29
+ # +const_name+ must be an object that responds to +to_s+.
30
+ #
31
+ # +const_name+ must be a <i>fully qualified name</i>. For example, this will not work as expected:
32
+ #
33
+ # module Mod
34
+ # Foo = 'foo'
35
+ # remove_const(:Foo)
36
+ # end
37
+ #
38
+ # because it will try to remove ::Foo instead of Mod::Foo. Fortunately, however, this will work as expected:
39
+ #
40
+ # module Mod
41
+ # Foo = 'foo'
42
+ # remove_const(Foo.name)
43
+ # end
44
+ #
45
+ # This method is partially inspired by Facets' Kernel#constant method, which provided a more user-friendly alternative to const_get.
46
+ #
47
+ def remove_const(const_name)
48
+ #require 'pp'
49
+ #puts "remove_const(#{const_name})"
50
+ raise ArgumentError unless const_name.respond_to?(:to_s)
51
+ nesting = const_name.to_s.split(/::/).map(&:to_sym)
52
+ if nesting.size > 1
53
+ parent_module = constant(nesting[0..-2].join('::')) # For example, would be A::B for A::B::C
54
+ const_to_remove = nesting[-1] # For example, would be :C for A::B::C
55
+ parent_module.ignore_access.remove_const_before_was_added_to_Kernel(const_to_remove)
56
+ else
57
+ ignore_access.remove_const_before_was_added_to_Kernel(const_name)
58
+ end
59
+ end
60
+ end
61
+
62
+ #p Module.private_instance_methods.grep(/remove_const/) # Lists it
63
+ Module.send(:remove_method, :remove_const)
64
+ #p Module.instance_methods.grep(/remove_const/) # Does list it, because inherits *public* remove_const from Kernel
65
+ #p Module.private_instance_methods.grep(/remove_const/) # Does not list it, because it's no longer private
66
+ Module.send(:define_method, :remove_const, Kernel.method(:remove_const))
67
+ #p Module.private_instance_methods.grep(/remove_const/) # Lists it
68
+
69
+ # _____ _
70
+ # |_ _|__ ___| |_
71
+ # | |/ _ \/ __| __|
72
+ # | | __/\__ \ |_
73
+ # |_|\___||___/\__|
74
+ #
75
+ =begin test
76
+ require 'test/unit'
77
+
78
+ # Important regression test. This was failing at one point.
79
+ module A
80
+ B = nil
81
+ remove_const :B
82
+ end
83
+
84
+ # How it would be done *without* this extension:
85
+ module TestRemoveABC_TheOldWay
86
+ module A
87
+ module B
88
+ C = 'foo'
89
+ end
90
+ end
91
+
92
+ class TheTest < Test::Unit::TestCase
93
+ def test_1
94
+ assert_nothing_raised { A::B::C }
95
+ A::B.send(:remove_const, :C)
96
+ assert_raise(NameError) { A::B::C }
97
+ end
98
+ end
99
+ end
100
+
101
+ # How it would be done *with* this extension (all tests that follow):
102
+
103
+ module TestRemoveABC_CIsString
104
+ module A
105
+ module B
106
+ C = 'foo'
107
+ end
108
+ end
109
+
110
+ class TheTest < Test::Unit::TestCase
111
+ def test_1
112
+ assert_nothing_raised { A::B::C }
113
+ assert_raise(NoMethodError) { remove_const(A::B::C.name) } # Because C is a *string*, not a *module*
114
+ assert_nothing_raised { remove_const A::B.name + '::C' }
115
+ assert_raise(NameError) { A::B::C }
116
+ end
117
+ end
118
+ end
119
+
120
+ module TestRemoveAB_UsingName
121
+ module A
122
+ module B
123
+ end
124
+ end
125
+
126
+ class TheTest < Test::Unit::TestCase
127
+ def test_1
128
+ assert_nothing_raised { A::B }
129
+ remove_const(A::B.name)
130
+ assert_raise(NameError) { A::B }
131
+ end
132
+ end
133
+ end
134
+
135
+ module TestRemoveAB_Symbol
136
+ module A
137
+ module B
138
+ Foo = :Foo
139
+ end
140
+ end
141
+
142
+ remove_const(:'A::B::Foo') # This tests that Module#remove_const was overriden as well.
143
+ # If we hadn't also overriden Module#remove_const, then this would have caused this error:
144
+ # in `remove_const': `A::B::Foo' is not allowed as a constant name (NameError)
145
+
146
+ class TheTest < Test::Unit::TestCase
147
+ def test_1
148
+ assert_nothing_raised { A::B }
149
+
150
+ assert_equal 'TestRemoveAB_Symbol::A', A.name
151
+ assert_raise(NameError) { remove_const(:'A::B') } # This doesn't work because A, when evaluated in this context,
152
+ # is TestRemoveAB_Symbol::TheTest::A, which is *not* defined.
153
+
154
+ remove_const(:'TestRemoveAB_Symbol::A::B')
155
+ assert_raise(NameError) { A::B }
156
+ end
157
+ end
158
+ end
159
+
160
+ module TestRemoveAB_Symbol2
161
+ class TheTest < Test::Unit::TestCase
162
+ module A
163
+ module B
164
+ end
165
+ end
166
+ def test_1
167
+ assert_nothing_raised { A::B }
168
+
169
+ assert_equal 'TestRemoveAB_Symbol2::TheTest::A', A.name
170
+ remove_const(:'A::B') # Does work, because A is defined *within* TheTest this time.
171
+ assert_raise(NameError) { A::B }
172
+ end
173
+ end
174
+ end
175
+
176
+ =end
177
+
178
+
@@ -0,0 +1,127 @@
1
+ #--
2
+ # Author:: Tyler Rick
3
+ # Copyright:: Copyright (c) 2007 QualitySmith, Inc.
4
+ # License:: Ruby License
5
+ # Submit to Facets?:: No.
6
+ # Developer notes::
7
+ # * Deprecated by qualitysmith_extensions/module/remove.rb
8
+ #++
9
+
10
+ require 'rubygems'
11
+ require 'qualitysmith_extensions/object/ignore_access'
12
+ require 'qualitysmith_extensions/module/split'
13
+ require 'facets/core/module/by_name'
14
+ require 'facets/core/module/modspace'
15
+
16
+ module Kernel
17
+ # This is similar to +remove_const+, but it _only_ works for modules/classes.
18
+ #
19
+ # This is similar to the built-in <tt>Module#remove_module</tt>, but it is accessible from all "levels" (because it is defined
20
+ # in +Kernel+) and can handle hierarchy.
21
+ #
22
+ # Makes it possible to write simply:
23
+ # remove_module(A::B::C)
24
+ # rather than having to think about which module the constant is actually defined in and calling +remove_const+ on that module.
25
+ # This is how you would have to otherwise do it:
26
+ # A::B.send(:remove_const, :C)
27
+ #
28
+ # You can pass in either a constant or a symbol. Passing in a constant is preferred
29
+ #
30
+ # This method is partially inspired by Facets' Kernel#constant method, which provided a more user-friendly alternative to const_get.
31
+ #
32
+ def remove_module(const)
33
+ const = Module.by_name(const.to_s) if const.is_a?(Symbol)
34
+ if const.split.size > 1
35
+ parent_module = const.modspace # For example, would be A::B for A::B::C
36
+ const_to_remove = const.split.last # For example, would be :C for A::B::C
37
+ parent_module.ignore_access.remove_const(const_to_remove)
38
+ else
39
+ Object.ignore_access.remove_const(const.name)
40
+ end
41
+ end
42
+ end
43
+
44
+ # _____ _
45
+ # |_ _|__ ___| |_
46
+ # | |/ _ \/ __| __|
47
+ # | | __/\__ \ |_
48
+ # |_|\___||___/\__|
49
+ #
50
+ =begin test
51
+ require 'test/unit'
52
+ require 'qualitysmith_extensions/kernel/remove_const' # Test for compatibility. Just in case the remove_const_before_was_added_to_Kernel alias might have thrown something off.
53
+
54
+ # How it would be done *without* this extension:
55
+ module TestRemoveABC_TheOldWay
56
+ module A
57
+ module B
58
+ class C
59
+ end
60
+ end
61
+ end
62
+
63
+ class TheTest < Test::Unit::TestCase
64
+ def test_1
65
+ assert_nothing_raised { A::B::C }
66
+ A::B.send(:remove_const, :C)
67
+ assert_raise(NameError) { A::B::C }
68
+ end
69
+ end
70
+ end
71
+
72
+ # How it would be done *with* this extension:
73
+ module TestRemoveABC
74
+ module A
75
+ module B
76
+ class C
77
+ end
78
+ end
79
+ end
80
+
81
+ class TheTest < Test::Unit::TestCase
82
+ def test_1
83
+ assert_nothing_raised { A::B::C }
84
+ remove_module(A::B::C)
85
+ assert_raise(NameError) { A::B::C }
86
+ end
87
+ end
88
+ end
89
+
90
+ module TestRemoveAB
91
+ module A
92
+ module B
93
+ module C
94
+ end
95
+ end
96
+ end
97
+
98
+ class TheTest < Test::Unit::TestCase
99
+ def test_1
100
+ assert_nothing_raised { A::B }
101
+ remove_module(A::B)
102
+ assert_raise(NameError) { A::B }
103
+ end
104
+ end
105
+ end
106
+
107
+ module TestRemoveAB_Symbol
108
+ module A
109
+ module B
110
+ module C
111
+ end
112
+ end
113
+ end
114
+
115
+ class TheTest < Test::Unit::TestCase
116
+ def test_1
117
+ assert_nothing_raised { A::B }
118
+ assert_raise(NameError) { remove_module(:'A::B') } # This is why passing in the module itself is preferred.
119
+ remove_module(:'TestRemoveAB_Symbol::A::B')
120
+ assert_raise(NameError) { A::B }
121
+ end
122
+ end
123
+ end
124
+
125
+ =end
126
+
127
+