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,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