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,41 @@
1
+ #--
2
+ # Author:: Tyler Rick
3
+ # Copyright:: Copyright (c) 2007 QualitySmith, Inc.
4
+ # License:: Ruby License
5
+ # Submit to Facets?:: Yes! A great compliment to each_char!
6
+ # Developer notes::
7
+ #++
8
+
9
+ require 'rubygems'
10
+ require 'qualitysmith_extensions/enumerable/enum'
11
+
12
+ class String
13
+ def each_char_with_index
14
+ i = 0
15
+ split(//).each do |c|
16
+ yield i, c
17
+ i += 1
18
+ end
19
+ end
20
+ end
21
+
22
+
23
+
24
+ # _____ _
25
+ # |_ _|__ ___| |_
26
+ # | |/ _ \/ __| __|
27
+ # | | __/\__ \ |_
28
+ # |_|\___||___/\__|
29
+ #
30
+ =begin test
31
+ require 'test/unit'
32
+
33
+ class TheTest < Test::Unit::TestCase
34
+ def test_1
35
+ assert_equal [[0, "a"], [1, "b"], [2, "c"]],
36
+ 'abc'.enum(:each_char_with_index).to_a
37
+ end
38
+ end
39
+ =end
40
+
41
+
@@ -0,0 +1,29 @@
1
+ #--
2
+ # Author:: Tyler Rick
3
+ # Copyright:: Copyright (c) 2007 QualitySmith, Inc.
4
+ # License:: Ruby License
5
+ # Submit to Facets?:: Yes
6
+ #++
7
+
8
+ require "digest/md5"
9
+
10
+ class String
11
+ # Because it's so much more natural to have this as a method of the string rather than having to call <tt>Digest::MD5.hexdigest(string)</tt>.
12
+ def md5
13
+ return Digest::MD5.hexdigest(self)
14
+ end
15
+ end
16
+
17
+ # _____ _
18
+ # |_ _|__ ___| |_
19
+ # | |/ _ \/ __| __|
20
+ # | | __/\__ \ |_
21
+ # |_|\___||___/\__|
22
+ #
23
+ =begin test
24
+ class TheTest < Test::Unit::TestCase
25
+ def test_md5
26
+ assert_equal "abc".md5, Digest::MD5.hexdigest("abc")
27
+ end
28
+ end
29
+ =end
@@ -0,0 +1,43 @@
1
+ #--
2
+ # Author:: Tyler Rick
3
+ # Copyright:: Copyright (c) 2007 QualitySmith, Inc.
4
+ # License:: Ruby License
5
+ # Submit to Facets?:: Yes
6
+ #++
7
+
8
+ require 'rubygems'
9
+ require 'escape' # http://www.a-k-r.org/escape/
10
+ require 'facets/core/symbol/to_proc' unless Symbol.method_defined?(:to_proc)
11
+ require 'facets/core/kernel/require_local'
12
+
13
+ class String
14
+ def shell_escape
15
+ Escape.shell_command([self])
16
+ end
17
+ end
18
+
19
+ # _____ _
20
+ # |_ _|__ ___| |_
21
+ # | |/ _ \/ __| __|
22
+ # | | __/\__ \ |_
23
+ # |_|\___||___/\__|
24
+ #
25
+ =begin test
26
+ require 'test/unit'
27
+ class TheTest < Test::Unit::TestCase
28
+ def assert_that_echo_gives_back_what_we_put_in(input)
29
+ input = %q{!&'"`$0 |()<>}
30
+ output = `echo -n #{input.shell_escape}`
31
+ assert_equal input, output
32
+ end
33
+ def test_1
34
+ assert_that_echo_gives_back_what_we_put_in(
35
+ %q{!&'"`$0 |()<>} )
36
+ end
37
+ def test_2
38
+ assert_that_echo_gives_back_what_we_put_in(
39
+ %q{'an arg that's got "quotes"} )
40
+ end
41
+ end
42
+ =end
43
+
@@ -0,0 +1,37 @@
1
+ #--
2
+ # Author:: Tyler Rick
3
+ # Copyright:: Copyright (c) 2007 QualitySmith, Inc.
4
+ # License:: Ruby License
5
+ # Submit to Facets?:: Probably not.
6
+ # Developer notes:
7
+ # * Can we use a more general method instead (like humanize or methodize)? Does this really have a use distinct from all the other inflection methods out there?
8
+ #++
9
+
10
+ class String
11
+ # Strips out most non-alphanumeric characters and leaves you with a lowercased, underscored string that can safely be used as a class_name
12
+ def to_underscored_label
13
+ self.
14
+ downcase.
15
+ gsub(/-+/, "_").gsub(/ +/, "_"). # spaces and -'s-> underscores
16
+ gsub(/[^a-z0-9_]/, ""). # keep only alphanumeric and _ characters
17
+ gsub(/_+$/, ""). # We don't want any _ characters at the end
18
+ gsub(/^_+/, "") # ... or the beginning
19
+ end
20
+ end
21
+
22
+ # _____ _
23
+ # |_ _|__ ___| |_
24
+ # | |/ _ \/ __| __|
25
+ # | | __/\__ \ |_
26
+ # |_|\___||___/\__|
27
+ #
28
+ =begin test
29
+ class TheTest < Test::Unit::TestCase
30
+ def test_to_underscored_label
31
+ assert_equal "discount_amount", "Discount Amount".to_underscored_label
32
+ assert_equal "more_spaces", "More SPACES".to_underscored_label
33
+ assert_equal "other_123_types_of_characters", "Other-123 Types? Of!!! Characters".to_underscored_label
34
+ assert_equal "weird_characters_on_the_end", "weird characters on the end *#*#**".to_underscored_label
35
+ end
36
+ end
37
+ =end
@@ -0,0 +1,64 @@
1
+ #--
2
+ # Author:: Tyler Rick
3
+ # Copyright:: Copyright (c) 2007 QualitySmith, Inc.
4
+ # License:: Ruby License
5
+ # Submit to Facets?:: Maybe
6
+ #++
7
+
8
+ module WithKnowledgeOfColor
9
+ Color_regexp = /\e\[[^m]+m/
10
+
11
+ def strip_color
12
+ gsub(Color_regexp, '')
13
+ end
14
+
15
+ # This version of +length+ takes into account the fact that the ANSI color codes themselves don't take up any space to display on the screen.
16
+ # So this returns the number of characters wide the string is when it is actually printed to the screen.
17
+ def length_without_color
18
+ strip_color.length
19
+ end
20
+
21
+ def nonprinting_characters_used_for_color
22
+ self.scan(Color_regexp).join
23
+ end
24
+
25
+ def ljust_without_color(width)
26
+ ljust(width + nonprinting_characters_used_for_color.length)
27
+ end
28
+ end
29
+
30
+ class String
31
+ include WithKnowledgeOfColor
32
+ end
33
+
34
+ # _____ _
35
+ # |_ _|__ ___| |_
36
+ # | |/ _ \/ __| __|
37
+ # | | __/\__ \ |_
38
+ # |_|\___||___/\__|
39
+ #
40
+ =begin test
41
+ require 'rubygems'
42
+ gem 'colored'
43
+ require 'colored'
44
+
45
+ class TheTest < Test::Unit::TestCase
46
+ def test_strip_color
47
+ assert "abc" != "abc".blue
48
+ assert_equal "abc", "abc".blue.strip_color
49
+ end
50
+ def test_length_without_color
51
+ assert_equal 12, "abc".blue.length
52
+ assert_equal 3, "abc".blue.length_without_color
53
+ end
54
+ def test_nonprinting_characters_used_for_color
55
+ assert_equal "\e[34m\e[0m", 'abc'.blue.nonprinting_characters_used_for_color
56
+ end
57
+ def test_ljust_without_color
58
+ assert_equal "abc ", 'abc'. ljust( 5)
59
+ assert_equal "abc ", 'abc'.blue.ljust_without_color(5).strip_color
60
+ assert_equal "\e[34mabc\e[0m ", 'abc'.blue.ljust_without_color(5)
61
+ end
62
+
63
+ end
64
+ =end
@@ -0,0 +1,69 @@
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
+ # Changes::
8
+ #++
9
+
10
+ require 'rubygems'
11
+ require 'facets/core/kernel/constant'
12
+
13
+ class Symbol
14
+ # Tries to find a declared constant with the name specified in self.
15
+ #
16
+ # :Foo.constantize => Foo
17
+ #
18
+ # Unlike ActiveSupport, we don't do this check (because Kernel.module "can handle module hierarchy"):
19
+ # vendor/rails/activesupport/lib/active_support/inflector.rb
20
+ # unless /\A(?:::)?([A-Z]\w*(?:::[A-Z]\w*)*)\z/ =~ camel_cased_word
21
+ # raise NameError, "#{camel_cased_word.inspect} is not a valid constant name!"
22
+ # end
23
+ def constantize
24
+ Kernel.constant(self)
25
+ end
26
+ end
27
+ class String
28
+ # Tries to find a declared constant with the name specified in self.
29
+ #
30
+ # 'Foo'.constantize => Foo
31
+ #
32
+ # Unlike ActiveSupport, we don't do this check (because Kernel.module "can handle module hierarchy"):
33
+ # vendor/rails/activesupport/lib/active_support/inflector.rb
34
+ # unless /\A(?:::)?([A-Z]\w*(?:::[A-Z]\w*)*)\z/ =~ camel_cased_word
35
+ # raise NameError, "#{camel_cased_word.inspect} is not a valid constant name!"
36
+ # end
37
+ def constantize
38
+ Kernel.constant(self)
39
+ end
40
+ end
41
+
42
+ # _____ _
43
+ # |_ _|__ ___| |_
44
+ # | |/ _ \/ __| __|
45
+ # | | __/\__ \ |_
46
+ # |_|\___||___/\__|
47
+ #
48
+ =begin test
49
+ require 'test/unit'
50
+
51
+ module OuterModule; end
52
+ module OuterModule::InnerModule; end
53
+
54
+ class SymbolTest < Test::Unit::TestCase
55
+ module InnerModule; end
56
+ def test_1
57
+ assert_equal OuterModule, :OuterModule.constantize
58
+ assert_equal OuterModule::InnerModule, :'OuterModule::InnerModule'.constantize
59
+ end
60
+ end
61
+ class StringTest < Test::Unit::TestCase
62
+ module InnerModule; end
63
+ def test_1
64
+ assert_equal OuterModule, 'OuterModule'.constantize
65
+ assert_equal OuterModule::InnerModule, 'OuterModule::InnerModule'.constantize
66
+ end
67
+ end
68
+ =end
69
+
@@ -0,0 +1,157 @@
1
+ #--
2
+ # Author:: Tyler Rick
3
+ # Copyright:: Copyright (c) 2007 QualitySmith, Inc.
4
+ # License:: Ruby License
5
+ # Submit to Facets?:: Maybe, if we can get the bugs worked out. I can't believe Facets has Regexp#chomp, capitalize, downcase, etc., but not match/=~ !
6
+ # Developer notes::
7
+ # * Rename to symbol/regexp.rb ?
8
+ #++
9
+
10
+ require 'rubygems'
11
+ require 'facets/core/module/alias_method_chain'
12
+
13
+ unless defined?(Symbol::HasSymbolSupport)
14
+
15
+ class Symbol
16
+ HasSymbolSupport = true
17
+
18
+ def match(regexp)
19
+ to_s.match(regexp)
20
+ end
21
+
22
+ # Warning: Due to what I think is a bug in Ruby, $1, Regexp.last_match do not yield accurate results when queried after
23
+ # returning from a method call that does a regexp match!
24
+ # If you need access to that data, you're better off just doing :symbol.to_s =~ /regexp/ yourself.
25
+ # If all you need is a true/false (matches or doesn't match) result, then you can use this.
26
+ # :cat =~ /c.t/
27
+ #
28
+ def =~(regexp)
29
+ to_s =~ regexp
30
+ end
31
+ # Seems to be equivalent to this, if anyone cares:
32
+ # m = self.match(regexp)
33
+ # m ? m.begin(0) : nil
34
+
35
+ end
36
+
37
+ # I would just do something like this, but it causes the $1-not-set-after-method-call bug to infect anything that uses Regexp#===, which would be really bad!!
38
+ #class Regexp
39
+ # alias_method :orig_eee, :===
40
+ # def === (other)
41
+ # orig_eee(other)
42
+ # end
43
+ #
44
+ #end
45
+ # I can't even run the tests in this file after making this (trivial) wrapper for ===! If I try, I get this error:
46
+ #/usr/lib/ruby/1.8/optparse.rb:1099:in `make_switch': undefined method `downcase' for nil:NilClass (NoMethodError)
47
+ # from /usr/lib/ruby/1.8/optparse.rb:1032:in `each'
48
+ # from /usr/lib/ruby/1.8/optparse.rb:1032:in `make_switch'
49
+ # from /usr/lib/ruby/1.8/optparse.rb:1140:in `define'
50
+ # from /usr/lib/ruby/1.8/optparse.rb:1149:in `on'
51
+ # from /usr/lib/ruby/1.8/test/unit/autorunner.rb:106:in `options'
52
+ # from /usr/lib/ruby/1.8/optparse.rb:755:in `initialize'
53
+ # from /usr/lib/ruby/1.8/test/unit/autorunner.rb:101:in `new'
54
+ # from /usr/lib/ruby/1.8/test/unit/autorunner.rb:101:in `options'
55
+ # from /usr/lib/ruby/1.8/test/unit/autorunner.rb:88:in `process_args'
56
+ # from /usr/lib/ruby/1.8/test/unit/autorunner.rb:10:in `run'
57
+ # from /usr/lib/ruby/1.8/test/unit.rb:278
58
+ # from -:46
59
+
60
+ class Regexp
61
+ def eee_with_support_for_symbols (other)
62
+ case other
63
+ when Symbol
64
+ __send__ :===, other.to_s
65
+ else
66
+ __send__ :===, other
67
+ end
68
+ end
69
+
70
+ module WithSupportForSymbols
71
+ def self.extended(base)
72
+ base.class.class_eval do
73
+ alias_method :eee_without_support_for_symbols, :===
74
+ end
75
+ end
76
+ def === (other)
77
+ case other
78
+ when Symbol
79
+ eee_without_support_for_symbols(other.to_s)
80
+ else
81
+ eee_without_support_for_symbols(other)
82
+ end
83
+ end
84
+ end
85
+ end
86
+
87
+ module Enumerable
88
+ def grep_with_regexp_support_for_symbols(pattern, &block)
89
+ map { |element|
90
+ element.is_a?(Symbol) ? element.to_s : element
91
+ }.grep_without_regexp_support_for_symbols(pattern, &block)
92
+ end
93
+ alias_method_chain :grep, :regexp_support_for_symbols
94
+
95
+ end
96
+
97
+ end # unless defined?(Symbol::HasSymbolSupport)
98
+
99
+ # _____ _
100
+ # |_ _|__ ___| |_
101
+ # | |/ _ \/ __| __|
102
+ # | | __/\__ \ |_
103
+ # |_|\___||___/\__|
104
+ #
105
+ =begin test
106
+ require 'test/unit'
107
+ require 'rubygems'
108
+ require 'qualitysmith_extensions/object/singleton_send'
109
+
110
+ class TheTest < Test::Unit::TestCase
111
+ def test_equal_tilde
112
+ assert_equal 1, :chopper =~ /hopper/
113
+ end
114
+ def test_match
115
+ assert :chopper.match(/hopper/).is_a?(MatchData)
116
+ assert_equal 'hopper', :chopper.match(/hopper/).to_s
117
+ end
118
+ def test_triple_equal
119
+ assert_equal true, /hopper/ === 'chopper'
120
+ assert_equal false, /hopper/ === :chopper # Doesn't work!
121
+
122
+ assert_equal true, /hopper/.eee_with_support_for_symbols(:chopper)
123
+ assert_equal true, /hopper/.singleton_send(Regexp::WithSupportForSymbols, :===, :chopper)
124
+ regexp = /chopper/
125
+ regexp.extend Regexp::WithSupportForSymbols
126
+ assert_equal true, regexp === :chopper
127
+ end
128
+
129
+ # Due to what I think is a BUG in Ruby, the details of the last_match appear to be reset after returning from a method.
130
+ # In other words, if you print out $1 from within Symbol#=~, it has the value you'd expected, but as soon as we get back from
131
+ # Symbol#=~, it's gone!
132
+ # See http://svn.tylerrick.com/public/ruby/examples/regexp-variables_reset_after_return_from_method.rb
133
+ def test_the_setting_of_match_variables
134
+ # This doesn't work, unfortunately.
135
+ assert_equal 0, :cat =~ /c(.)t/
136
+ assert_equal nil, $1
137
+ assert_equal nil, Regexp.last_match(1)
138
+
139
+ # Nor this
140
+ assert :cat.match(/c(.)t/)
141
+ assert_equal nil, $1
142
+ assert_equal nil, Regexp.last_match(1)
143
+
144
+ # But if we do the to_s conversion *here* (as opposed to from within Symbol#=~), it works! Yuck!
145
+ assert_equal 0, :cat.to_s =~ /c(.)t/
146
+ assert_equal 'a', $1
147
+ assert_equal 'a', Regexp.last_match(1)
148
+ end
149
+
150
+ def test_grep
151
+ assert_equal ['a'], ['a', 'b', 'c'].grep(/a/)
152
+
153
+ # This only works because of our grep_with_regexp_support_for_symbols() monkey patch.
154
+ assert_equal ['a'], [:a, :b, :c].grep(/a/)
155
+ end
156
+ end
157
+ =end