quality_extensions 1.1.6 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +4 -0
- data/Gemfile +4 -0
- data/License +403 -0
- data/Rakefile +2 -0
- data/Readme.rdoc +2 -3
- data/VERSION +1 -0
- data/doc_include/ReleaseNotes-0.0.10 +1 -0
- data/doc_include/ReleaseNotes-0.0.12 +1 -0
- data/doc_include/ReleaseNotes-0.0.13 +2 -0
- data/doc_include/ReleaseNotes-0.0.14 +1 -0
- data/doc_include/ReleaseNotes-0.0.15 +2 -0
- data/doc_include/ReleaseNotes-0.0.16 +1 -0
- data/doc_include/ReleaseNotes-0.0.17 +1 -0
- data/doc_include/ReleaseNotes-0.0.18 +1 -0
- data/doc_include/ReleaseNotes-0.0.19 +1 -0
- data/doc_include/ReleaseNotes-0.0.20 +1 -0
- data/doc_include/ReleaseNotes-0.0.21 +7 -0
- data/doc_include/ReleaseNotes-0.0.22 +2 -0
- data/doc_include/ReleaseNotes-0.0.23 +1 -0
- data/doc_include/ReleaseNotes-0.0.24 +3 -0
- data/doc_include/ReleaseNotes-0.0.25 +3 -0
- data/doc_include/ReleaseNotes-0.0.26 +2 -0
- data/doc_include/ReleaseNotes-0.0.27 +1 -0
- data/doc_include/ReleaseNotes-0.0.28 +1 -0
- data/doc_include/ReleaseNotes-0.0.29 +3 -0
- data/doc_include/ReleaseNotes-0.0.3 +1 -0
- data/doc_include/ReleaseNotes-0.0.30 +4 -0
- data/doc_include/ReleaseNotes-0.0.31 +1 -0
- data/doc_include/ReleaseNotes-0.0.32 +1 -0
- data/doc_include/ReleaseNotes-0.0.33 +1 -0
- data/doc_include/ReleaseNotes-0.0.34 +2 -0
- data/doc_include/ReleaseNotes-0.0.35 +1 -0
- data/doc_include/ReleaseNotes-0.0.36 +1 -0
- data/doc_include/ReleaseNotes-0.0.37 +1 -0
- data/doc_include/ReleaseNotes-0.0.38 +1 -0
- data/doc_include/ReleaseNotes-0.0.39 +1 -0
- data/doc_include/ReleaseNotes-0.0.4 +2 -0
- data/doc_include/ReleaseNotes-0.0.40 +1 -0
- data/doc_include/ReleaseNotes-0.0.41 +1 -0
- data/doc_include/ReleaseNotes-0.0.42 +2 -0
- data/doc_include/ReleaseNotes-0.0.43 +2 -0
- data/doc_include/ReleaseNotes-0.0.44 +3 -0
- data/doc_include/ReleaseNotes-0.0.45 +1 -0
- data/doc_include/ReleaseNotes-0.0.46 +1 -0
- data/doc_include/ReleaseNotes-0.0.47 +1 -0
- data/doc_include/ReleaseNotes-0.0.48 +2 -0
- data/doc_include/ReleaseNotes-0.0.49 +2 -0
- data/doc_include/ReleaseNotes-0.0.5 +1 -0
- data/doc_include/ReleaseNotes-0.0.50 +1 -0
- data/doc_include/ReleaseNotes-0.0.51 +1 -0
- data/doc_include/ReleaseNotes-0.0.52 +1 -0
- data/doc_include/ReleaseNotes-0.0.53 +3 -0
- data/doc_include/ReleaseNotes-0.0.54 +1 -0
- data/doc_include/ReleaseNotes-0.0.55 +2 -0
- data/doc_include/ReleaseNotes-0.0.56 +1 -0
- data/doc_include/ReleaseNotes-0.0.57 +3 -0
- data/doc_include/ReleaseNotes-0.0.58 +1 -0
- data/doc_include/ReleaseNotes-0.0.59 +1 -0
- data/doc_include/ReleaseNotes-0.0.6 +3 -0
- data/doc_include/ReleaseNotes-0.0.60 +3 -0
- data/doc_include/ReleaseNotes-0.0.61 +1 -0
- data/doc_include/ReleaseNotes-0.0.62 +1 -0
- data/doc_include/ReleaseNotes-0.0.63 +1 -0
- data/doc_include/ReleaseNotes-0.0.64 +1 -0
- data/doc_include/ReleaseNotes-0.0.7 +1 -0
- data/doc_include/ReleaseNotes-0.0.8 +2 -0
- data/doc_include/ReleaseNotes-0.0.9 +1 -0
- data/doc_include/ReleaseNotes-0.1.1 +1 -0
- data/doc_include/ReleaseNotes-0.1.2 +1 -0
- data/doc_include/ReleaseNotes-0.1.3 +1 -0
- data/doc_include/ReleaseNotes-0.1.4 +1 -0
- data/doc_include/ReleaseNotes-0.1.5 +0 -0
- data/doc_include/ReleaseNotes-1.0.0 +1 -0
- data/doc_include/ReleaseNotes-1.0.1 +1 -0
- data/doc_include/ReleaseNotes-1.0.2 +1 -0
- data/doc_include/ReleaseNotes-1.0.3 +1 -0
- data/doc_include/ReleaseNotes-1.1.0 +1 -0
- data/doc_include/ReleaseNotes-1.1.1 +1 -0
- data/doc_include/ReleaseNotes-1.1.6 +1 -0
- data/doc_include/assert_equal_with_difference_highlighting-there_he_is.png +0 -0
- data/doc_include/assert_equal_with_difference_highlighting-wheres_waldo.png +0 -0
- data/escape/Rakefile +62 -0
- data/escape/Readme +16 -0
- data/escape/doc_include/ReleaseNotes-0.0.1 +1 -0
- data/escape/doc_include/ReleaseNotes-0.0.3 +1 -0
- data/escape/doc_include/ReleaseNotes-0.0.4 +1 -0
- data/escape/doc_include/ReleaseNotes-0.0.5 +1 -0
- data/escape/doc_include/template/qualitysmith.rb +631 -0
- data/escape/lib/escape.rb +302 -0
- data/escape/pkg/escape-0.0.5.tgz +0 -0
- data/escape/pkg/escape-0.0.5.zip +0 -0
- data/escape/pkg/escape-0.0.5/Readme +16 -0
- data/escape/pkg/escape-0.0.5/doc_include/template/qualitysmith.rb +631 -0
- data/escape/pkg/escape-0.0.5/lib/escape.rb +302 -0
- data/lib/quality_extensions.rb +3 -1
- data/lib/quality_extensions/array/average.rb +45 -0
- data/lib/quality_extensions/array/expand_ranges.rb +2 -2
- data/lib/quality_extensions/array/shell_escape.rb +2 -2
- data/lib/quality_extensions/color/gradiate.rb +5 -5
- data/lib/quality_extensions/enumerable/every.rb +2 -2
- data/lib/quality_extensions/enumerable/grep_with_index.rb +51 -0
- data/lib/quality_extensions/enumerable/grepv.rb +1 -0
- data/lib/quality_extensions/enumerable/map_with_index.rb +2 -0
- data/lib/quality_extensions/enumerable/max_by_value.rb +72 -0
- data/lib/quality_extensions/enumerable/select_while.rb +7 -2
- data/lib/quality_extensions/enumerable/select_with_index.rb +2 -2
- data/lib/quality_extensions/float/truncate.rb +2 -1
- data/lib/quality_extensions/hash/except.rb +2 -2
- data/lib/quality_extensions/hash/to_query_string.rb +6 -6
- data/lib/quality_extensions/helpers/numbers.rb +259 -0
- data/lib/quality_extensions/kernel/die.rb +2 -2
- data/lib/quality_extensions/kernel/filter_output.rb +1 -0
- data/lib/quality_extensions/kernel/require_all.rb +7 -7
- data/lib/quality_extensions/module/guard_method.rb +3 -3
- data/lib/quality_extensions/object/non.rb +10 -4
- data/lib/quality_extensions/pathname.rb +51 -3
- data/lib/quality_extensions/regexp/named_captures.rb +7 -6
- data/lib/quality_extensions/regexp/to_plain_s.rb +116 -0
- data/lib/quality_extensions/safe_method.rb +100 -0
- data/lib/quality_extensions/safe_nil.rb +87 -11
- data/lib/quality_extensions/string/chomped_lines.rb +0 -0
- data/lib/quality_extensions/string/integer_eh.rb +2 -2
- data/lib/quality_extensions/string/prefix.rb +120 -0
- data/lib/quality_extensions/string/prefix_lines.rb +4 -69
- data/lib/quality_extensions/string/safe_numeric_conversion.rb +5 -5
- data/lib/quality_extensions/string/shell_escape.rb +3 -3
- data/lib/quality_extensions/string/to_proc.rb +119 -0
- data/lib/quality_extensions/template.rb +2 -2
- data/lib/quality_extensions/test/difference_highlighting.rb +2 -2
- data/lib/quality_extensions/version.rb +3 -0
- data/quality_extensions.gemspec +21 -0
- metadata +249 -145
- data/lib/Xfind_bug_test.rb +0 -28
@@ -1,5 +1,5 @@
|
|
1
1
|
#--
|
2
|
-
# Credits::
|
2
|
+
# Credits::
|
3
3
|
# * Tom Locke (http://hobocentral.net/blog/2007/08/25/quiz/) -- original version
|
4
4
|
# * coderrr (http://coderrr.wordpress.com/2007/09/15/the-ternary-destroyer/) -- some optimizations
|
5
5
|
# * Tyler Rick -- packaged it, added some documention, and added some tests
|
@@ -12,22 +12,30 @@
|
|
12
12
|
$LOAD_PATH << File.expand_path(File.join(File.dirname(__FILE__), '..', '..'))
|
13
13
|
require 'singleton'
|
14
14
|
require 'rubygems'
|
15
|
+
#require 'facets/functor'
|
16
|
+
gem 'builder'
|
15
17
|
require 'builder/blankslate'
|
16
18
|
#require 'facets/basicobject'
|
17
19
|
#puts Object.methods.include?(:blank_slate_method_added) # not there?
|
18
20
|
|
19
21
|
|
20
22
|
class Object
|
23
|
+
# If you are not sure if the receiver is nil?, you can prefix a method call / operation with _? to be safe. If the receiver is not nil, it will behave as if you'd called your method on the receiver directly.
|
24
|
+
# If on the other hand the receiver is nil (see NilClass#_?), calling _? will cause an instance of SafeNil to be the *real* receiver, which will returns nil when you actually call whatever real method you are calling.
|
21
25
|
def _?
|
22
26
|
self
|
23
27
|
end
|
28
|
+
|
29
|
+
#def unless_blank?
|
30
|
+
# self
|
31
|
+
#end
|
24
32
|
end
|
25
33
|
|
26
34
|
class NilClass
|
27
|
-
# The _? method just returns the object itself for all objects except for nil. For nil, _? will return a special version of nil (actually, an instance of
|
35
|
+
# The _? method just returns the object itself for all objects except for nil. For nil, _? will return a special version of nil (actually, an instance of
|
28
36
|
# SafeNil) that lets you call undefined methods.
|
29
37
|
#
|
30
|
-
# If you call an undefined method on nil._?, you will get back nil -- rather than raising an exception, which is what would happen if you called the same
|
38
|
+
# If you call an undefined method on nil._?, you will get back nil -- rather than raising an exception, which is what would happen if you called the same
|
31
39
|
# method on a _plain_ old nil!
|
32
40
|
#
|
33
41
|
# _? gives us a much conciser alternative to this common pattern:
|
@@ -49,23 +57,27 @@ class NilClass
|
|
49
57
|
end
|
50
58
|
end
|
51
59
|
|
60
|
+
# http://railstips.org/blog/archives/2009/08/07/patterns-are-not-scary-method-missing-proxy/
|
61
|
+
class BasicObject #:nodoc:
|
62
|
+
instance_methods.each { |m| undef_method m unless m =~ /^__|instance_eval/ }
|
63
|
+
end unless defined?(BasicObject)
|
52
64
|
|
53
65
|
# Extending BasicObject because it provides us with a clean slate. It is similar to Object except it has almost all the standard methods stripped away so that
|
54
66
|
# we will hit method_missing for almost all method routing.
|
55
|
-
|
67
|
+
#
|
68
|
+
# See NilClass#_?/Object#_?
|
69
|
+
class SafeNil < BasicObject
|
56
70
|
include ::Singleton # I assume this is because it's faster than instantiating a new object each time.
|
57
71
|
|
58
|
-
#
|
59
|
-
def inspect
|
60
|
-
'SafeNil'
|
61
|
-
end
|
62
|
-
|
72
|
+
# See NilClass#_?/Object#_?
|
63
73
|
def method_missing(method, *args, &block)
|
64
74
|
return nil unless nil.respond_to?(method) # A much faster alternative to 'rescue nil' that can be used most of the time to speed things up.
|
65
75
|
nil.send(method, *args, &block) rescue nil
|
66
76
|
end
|
67
77
|
|
78
|
+
# See NilClass#_?/Object#_?
|
68
79
|
def nil?; true; end
|
80
|
+
def blank?; true; end
|
69
81
|
end
|
70
82
|
|
71
83
|
|
@@ -81,7 +93,7 @@ end
|
|
81
93
|
=begin test
|
82
94
|
require 'test/unit'
|
83
95
|
|
84
|
-
class
|
96
|
+
class SafeNilTest < Test::Unit::TestCase
|
85
97
|
def test_simple__nil
|
86
98
|
hash = {}
|
87
99
|
assert_equal nil, hash[:a]._?.length
|
@@ -91,6 +103,12 @@ class TheTest < Test::Unit::TestCase
|
|
91
103
|
assert_equal 3, hash[:a]._?.length
|
92
104
|
end
|
93
105
|
|
106
|
+
def test_to_s
|
107
|
+
assert_equal '', nil._?.to_s
|
108
|
+
assert_equal( {}.to_s, {}._?.to_s ) # this is '' in 1.8, '{}' in 1.9
|
109
|
+
assert_equal [].to_s, []._?.to_s
|
110
|
+
end
|
111
|
+
|
94
112
|
def test_chaining
|
95
113
|
hash = {}
|
96
114
|
assert_equal nil, hash[:a]._?.foo
|
@@ -98,19 +116,77 @@ class TheTest < Test::Unit::TestCase
|
|
98
116
|
assert_equal nil, hash[:a]._?[:b]._?[:c]._?.some_method
|
99
117
|
end
|
100
118
|
|
119
|
+
# As far as I know, this is impossible to get to pass, since by design an object in Ruby is *always* truthy unless it is false or nil
|
120
|
+
#def test_or_ing
|
121
|
+
# assert_equal 'else', nil._? || 'else'
|
122
|
+
#end
|
123
|
+
|
101
124
|
def test_inspect
|
102
|
-
assert_equal '
|
125
|
+
assert_equal 'nil', nil._?.inspect
|
126
|
+
end
|
127
|
+
|
128
|
+
def test_does_not_permanently_modify_nil_class
|
129
|
+
assert_raise(NoMethodError) { nil.foo }
|
130
|
+
nil._?
|
131
|
+
assert_raise(NoMethodError) { nil.foo }
|
103
132
|
end
|
104
133
|
|
105
134
|
def test_nil?
|
106
135
|
assert SafeNil.instance.nil?
|
107
136
|
end
|
108
137
|
|
138
|
+
def test_blank?
|
139
|
+
require 'facets/blank'
|
140
|
+
assert nil.blank?
|
141
|
+
assert SafeNil.instance.blank?
|
142
|
+
assert ({1=>'a', 2=>'b'})[3]._?.blank?
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
class UnlessBlankTest < Test::Unit::TestCase
|
147
|
+
def test_simple__blank
|
148
|
+
hash = {}
|
149
|
+
assert_equal nil, hash[:a]._?.length
|
150
|
+
end
|
151
|
+
def test_simple__normal_objects
|
152
|
+
hash = {:a => 'abc'}
|
153
|
+
assert_equal 3, hash[:a]._?.length
|
154
|
+
end
|
155
|
+
|
156
|
+
def test_to_s
|
157
|
+
assert_equal '', nil._?.to_s
|
158
|
+
assert_equal( {}.to_s, {}._?.to_s ) # this is '' in 1.8, '{}' in 1.9
|
159
|
+
assert_equal [].to_s, []._?.to_s
|
160
|
+
end
|
161
|
+
|
162
|
+
def test_chaining
|
163
|
+
hash = {}
|
164
|
+
assert_equal nil, hash[:a]._?.foo
|
165
|
+
assert_equal nil, hash[:a]._?[:b]._?[:c]
|
166
|
+
assert_equal nil, hash[:a]._?[:b]._?[:c]._?.some_method
|
167
|
+
end
|
168
|
+
|
169
|
+
def test_inspect
|
170
|
+
assert_equal 'nil', nil._?.inspect
|
171
|
+
end
|
172
|
+
|
109
173
|
def test_does_not_permanently_modify_nil_class
|
110
174
|
assert_raise(NoMethodError) { nil.foo }
|
111
175
|
nil._?
|
112
176
|
assert_raise(NoMethodError) { nil.foo }
|
113
177
|
end
|
178
|
+
|
179
|
+
def test_nil?
|
180
|
+
assert SafeNil.instance.nil?
|
181
|
+
end
|
182
|
+
|
183
|
+
def test_blank?
|
184
|
+
require 'facets/blank'
|
185
|
+
assert nil.blank?
|
186
|
+
assert SafeNil.instance.blank?
|
187
|
+
assert ({1=>'a', 2=>'b'})[3]._?.blank?
|
188
|
+
end
|
189
|
+
|
114
190
|
end
|
115
191
|
=end
|
116
192
|
|
File without changes
|
@@ -1,3 +1,3 @@
|
|
1
1
|
# Alias for:
|
2
|
-
require 'facets/kernel/
|
3
|
-
|
2
|
+
require 'facets/kernel/require_relative'
|
3
|
+
require_relative 'numeric_eh'
|
@@ -0,0 +1,120 @@
|
|
1
|
+
#--
|
2
|
+
# Author:: Tyler Rick
|
3
|
+
# Copyright:: Copyright (c) 2009, Tyler Rick
|
4
|
+
# License:: Ruby License
|
5
|
+
# Submit to Facets?::
|
6
|
+
# Developer notes::
|
7
|
+
# Changes::
|
8
|
+
#++
|
9
|
+
|
10
|
+
class String
|
11
|
+
def prefix(prefix)
|
12
|
+
sub(/^/, prefix)
|
13
|
+
end
|
14
|
+
|
15
|
+
def unprefix(prefix)
|
16
|
+
sub(/^#{Regexp.escape(prefix)}/, "")
|
17
|
+
end
|
18
|
+
|
19
|
+
def suffix(suffix)
|
20
|
+
sub(/$/, suffix)
|
21
|
+
end
|
22
|
+
|
23
|
+
def unsuffix(suffix)
|
24
|
+
sub(/#{Regexp.escape(suffix)}$/, "")
|
25
|
+
end
|
26
|
+
|
27
|
+
#----------------------------------------------------------------------------------------------------
|
28
|
+
|
29
|
+
def prefix_lines(prefix)
|
30
|
+
gsub(/^/, prefix)
|
31
|
+
end
|
32
|
+
|
33
|
+
def unprefix_lines(prefix)
|
34
|
+
gsub(/^#{Regexp.escape(prefix)}/, "")
|
35
|
+
end
|
36
|
+
|
37
|
+
def suffix_lines(suffix)
|
38
|
+
gsub(/$/, suffix)
|
39
|
+
end
|
40
|
+
|
41
|
+
def unsuffix_lines(suffix)
|
42
|
+
gsub(/#{Regexp.escape(suffix)}$/, "")
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
|
48
|
+
# _____ _
|
49
|
+
# |_ _|__ ___| |_
|
50
|
+
# | |/ _ \/ __| __|
|
51
|
+
# | | __/\__ \ |_
|
52
|
+
# |_|\___||___/\__|
|
53
|
+
#
|
54
|
+
=begin test
|
55
|
+
require 'spec/autorun'
|
56
|
+
|
57
|
+
describe "String#prefix_lines" do
|
58
|
+
it "lets you indent lines, similar to Facets' String#indent(n)" do
|
59
|
+
"abc". prefix_lines(' ').should == ' abc'
|
60
|
+
" abc".prefix_lines(' '). should == ' abc'
|
61
|
+
|
62
|
+
("abc\n" +
|
63
|
+
"xyz" ).prefix_lines(' ').should ==
|
64
|
+
(" abc\n" +
|
65
|
+
" xyz")
|
66
|
+
end
|
67
|
+
|
68
|
+
it "lets you comment lines" do
|
69
|
+
"abc". prefix_lines('# ').should == '# abc'
|
70
|
+
" abc".prefix_lines('# ').should == '# abc'
|
71
|
+
|
72
|
+
("line 1\n" +
|
73
|
+
"line 2" ).prefix_lines('# ').should ==
|
74
|
+
("# line 1\n" +
|
75
|
+
"# line 2")
|
76
|
+
end
|
77
|
+
|
78
|
+
it "lets you uncomment lines" do
|
79
|
+
"# abc". unprefix_lines('# ').should == 'abc'
|
80
|
+
"# abc".unprefix_lines('# ').should == ' abc'
|
81
|
+
|
82
|
+
("# line 1\n" +
|
83
|
+
"# line 2" ).unprefix_lines('# ').should ==
|
84
|
+
("line 1\n" +
|
85
|
+
"line 2")
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
describe "String#suffix_lines" do
|
90
|
+
it "lets you indent lines, similar to Facets' String#indent(n)" do
|
91
|
+
"abc". suffix_lines(' ').should == 'abc '
|
92
|
+
"abc ".suffix_lines(' '). should == 'abc '
|
93
|
+
|
94
|
+
("abc\n" +
|
95
|
+
"xyz" ).suffix_lines(' ').should ==
|
96
|
+
("abc \n" +
|
97
|
+
"xyz ")
|
98
|
+
end
|
99
|
+
|
100
|
+
it "lets you add something to the end of each line" do
|
101
|
+
"abc". suffix_lines(' \\').should == 'abc \\'
|
102
|
+
"abc ".suffix_lines(' \\').should == 'abc \\'
|
103
|
+
|
104
|
+
("line 1\n" +
|
105
|
+
"line 2" ).suffix_lines(' \\').should ==
|
106
|
+
("line 1 \\\n" +
|
107
|
+
"line 2 \\")
|
108
|
+
end
|
109
|
+
|
110
|
+
it "lets you uncomment lines" do
|
111
|
+
"abc \\". unsuffix_lines(' \\').should == 'abc'
|
112
|
+
"abc \\".unsuffix_lines(' \\').should == 'abc '
|
113
|
+
|
114
|
+
("line 1 \\\n" +
|
115
|
+
"line 2 \\" ).unsuffix_lines(' \\').should ==
|
116
|
+
("line 1\n" +
|
117
|
+
"line 2")
|
118
|
+
end
|
119
|
+
end
|
120
|
+
=end
|
@@ -1,69 +1,4 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
#
|
4
|
-
|
5
|
-
# Submit to Facets?::
|
6
|
-
# Developer notes::
|
7
|
-
# Changes::
|
8
|
-
#++
|
9
|
-
|
10
|
-
class String
|
11
|
-
|
12
|
-
def prefix_lines(prefix)
|
13
|
-
gsub(/^/, prefix)
|
14
|
-
end
|
15
|
-
|
16
|
-
def unprefix_lines(prefix)
|
17
|
-
gsub(/^#{Regexp.escape(prefix)}/, "")
|
18
|
-
end
|
19
|
-
|
20
|
-
# TODO:
|
21
|
-
#def suffix_lines(suffix)
|
22
|
-
#def unsuffix_lines(suffix)
|
23
|
-
|
24
|
-
end
|
25
|
-
|
26
|
-
|
27
|
-
# _____ _
|
28
|
-
# |_ _|__ ___| |_
|
29
|
-
# | |/ _ \/ __| __|
|
30
|
-
# | | __/\__ \ |_
|
31
|
-
# |_|\___||___/\__|
|
32
|
-
#
|
33
|
-
=begin test
|
34
|
-
require 'spec'
|
35
|
-
|
36
|
-
describe "String#prefix_lines" do
|
37
|
-
|
38
|
-
it "lets you indent lines, similar to Facets' String#indent(n)" do
|
39
|
-
"abc". prefix_lines(' ').should == ' abc'
|
40
|
-
" abc".prefix_lines(' '). should == ' abc'
|
41
|
-
|
42
|
-
("abc\n" +
|
43
|
-
"xyz" ).prefix_lines(' ').should ==
|
44
|
-
(" abc\n" +
|
45
|
-
" xyz")
|
46
|
-
end
|
47
|
-
|
48
|
-
it "lets you comment lines" do
|
49
|
-
"abc". prefix_lines('# ').should == '# abc'
|
50
|
-
" abc".prefix_lines('# ').should == '# abc'
|
51
|
-
|
52
|
-
("line 1\n" +
|
53
|
-
"line 2" ).prefix_lines('# ').should ==
|
54
|
-
("# line 1\n" +
|
55
|
-
"# line 2")
|
56
|
-
end
|
57
|
-
|
58
|
-
it "lets you uncomment lines" do
|
59
|
-
"# abc". unprefix_lines('# ').should == 'abc'
|
60
|
-
"# abc".unprefix_lines('# ').should == ' abc'
|
61
|
-
|
62
|
-
("# line 1\n" +
|
63
|
-
"# line 2" ).unprefix_lines('# ').should ==
|
64
|
-
("line 1\n" +
|
65
|
-
"line 2")
|
66
|
-
end
|
67
|
-
|
68
|
-
end
|
69
|
-
=end
|
1
|
+
gem 'facets'
|
2
|
+
require 'facets/kernel/require_relative'
|
3
|
+
# Alias for:
|
4
|
+
require_relative 'prefix'
|
@@ -1,7 +1,7 @@
|
|
1
1
|
#--
|
2
2
|
# Author:: Tyler Rick
|
3
3
|
# Copyright:: Copyright (c) 2001, Leo [ slonika AT yahoo DOT com ], Tyler Rick
|
4
|
-
# Credits::
|
4
|
+
# Credits::
|
5
5
|
# - http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/14518
|
6
6
|
# License:: Ruby License
|
7
7
|
# Submit to Facets?::
|
@@ -24,8 +24,8 @@
|
|
24
24
|
class NumericError < RuntimeError
|
25
25
|
end
|
26
26
|
|
27
|
-
require 'facets/kernel/
|
28
|
-
|
27
|
+
require 'facets/kernel/require_relative'
|
28
|
+
require_relative 'numeric_eh'
|
29
29
|
|
30
30
|
|
31
31
|
class String
|
@@ -33,9 +33,9 @@ class String
|
|
33
33
|
alias __std__to_f to_f if ! method_defined? :__std__to_f
|
34
34
|
alias __std__hex hex if ! method_defined? :__std__hex
|
35
35
|
alias __std__oct oct if ! method_defined? :__std__oct
|
36
|
-
|
36
|
+
|
37
37
|
def to_i()
|
38
|
-
case self
|
38
|
+
case self
|
39
39
|
when /^[-+]?0\d/ then __std__oct
|
40
40
|
when /^[-+]?0x[a-f\d]/i then __std__hex
|
41
41
|
when /^[-+]?\d/ then __std__to_i
|
@@ -9,7 +9,7 @@ $LOAD_PATH << File.expand_path(File.join(File.dirname(__FILE__), '..', '..'))
|
|
9
9
|
require 'rubygems'
|
10
10
|
require 'escape' # http://www.a-k-r.org/escape/
|
11
11
|
require 'facets/symbol/to_proc'
|
12
|
-
require 'facets/kernel/
|
12
|
+
require 'facets/kernel/require_relative'
|
13
13
|
|
14
14
|
class String
|
15
15
|
def shell_escape
|
@@ -34,11 +34,11 @@ class TheTest < Test::Unit::TestCase
|
|
34
34
|
assert_equal input, output
|
35
35
|
end
|
36
36
|
def test_using_echo_1
|
37
|
-
assert_that_echo_gives_back_what_we_put_in(
|
37
|
+
assert_that_echo_gives_back_what_we_put_in(
|
38
38
|
%q{!&'"`$0 |()<>} )
|
39
39
|
end
|
40
40
|
def test_using_echo_2
|
41
|
-
assert_that_echo_gives_back_what_we_put_in(
|
41
|
+
assert_that_echo_gives_back_what_we_put_in(
|
42
42
|
%q{'an arg that's got "quotes"} )
|
43
43
|
end
|
44
44
|
|
@@ -0,0 +1,119 @@
|
|
1
|
+
# String#to_proc
|
2
|
+
#
|
3
|
+
# See http://weblog.raganwald.com/2007/10/stringtoproc.html ( Subscribe in a reader)
|
4
|
+
#
|
5
|
+
# Ported from the String Lambdas in Oliver Steele's Functional Javascript
|
6
|
+
# http://osteele.com/sources/javascript/functional/
|
7
|
+
#
|
8
|
+
# This work is licensed under the MIT License:
|
9
|
+
#
|
10
|
+
# (c) 2007 Reginald Braithwaite
|
11
|
+
# Portions Copyright (c) 2006 Oliver Steele
|
12
|
+
#
|
13
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
14
|
+
# a copy of this software and associated documentation files (the
|
15
|
+
# "Software"), to deal in the Software without restriction, including
|
16
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
17
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
18
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
19
|
+
# the following conditions:
|
20
|
+
#
|
21
|
+
# The above copyright notice and this permission notice shall be
|
22
|
+
# included in all copies or substantial portions of the Software.
|
23
|
+
#
|
24
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
25
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
26
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
27
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
28
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
29
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
30
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
31
|
+
|
32
|
+
class String
|
33
|
+
unless ''.respond_to?(:to_proc)
|
34
|
+
def to_proc &block
|
35
|
+
params = []
|
36
|
+
expr = self
|
37
|
+
sections = expr.split(/\s*->\s*/m)
|
38
|
+
if sections.length > 1 then
|
39
|
+
eval sections.reverse!.inject { |e, p| "(Proc.new { |#{p.split(/\s/).join(', ')}| #{e} })" }, block && block.binding
|
40
|
+
elsif expr.match(/\b_\b/)
|
41
|
+
eval "Proc.new { |_| #{expr} }", block && block.binding
|
42
|
+
else
|
43
|
+
leftSection = expr.match(/^\s*(?:[+*\/%&|\^\.=<>\[]|!=)/m)
|
44
|
+
rightSection = expr.match(/[+\-*\/%&|\^\.=<>!]\s*$/m)
|
45
|
+
if leftSection || rightSection then
|
46
|
+
if (leftSection) then
|
47
|
+
params.push('$left')
|
48
|
+
expr = '$left' + expr
|
49
|
+
end
|
50
|
+
if (rightSection) then
|
51
|
+
params.push('$right')
|
52
|
+
expr = expr + '$right'
|
53
|
+
end
|
54
|
+
else
|
55
|
+
self.gsub(
|
56
|
+
/(?:\b[A-Z]|\.[a-zA-Z_$])[a-zA-Z_$\d]*|[a-zA-Z_$][a-zA-Z_$\d]*:|self|arguments|'(?:[^'\\]|\\.)*'|"(?:[^"\\]|\\.)*"/, ''
|
57
|
+
).scan(
|
58
|
+
/([a-z_$][a-z_$\d]*)/i
|
59
|
+
) do |v|
|
60
|
+
params.push(v) unless params.include?(v)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
eval "Proc.new { |#{params.join(', ')}| #{expr} }", block && block.binding
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
|
70
|
+
# _____ _
|
71
|
+
# |_ _|__ ___| |_
|
72
|
+
# | |/ _ \/ __| __|
|
73
|
+
# | | __/\__ \ |_
|
74
|
+
# |_|\___||___/\__|
|
75
|
+
#
|
76
|
+
=begin test
|
77
|
+
require 'spec/autorun'
|
78
|
+
|
79
|
+
describe "String to Proc" do
|
80
|
+
|
81
|
+
before(:all) do
|
82
|
+
@one2five = 1..5
|
83
|
+
end
|
84
|
+
|
85
|
+
it "should handle simple arrow notation" do
|
86
|
+
@one2five.map(&'x -> x + 1').should eql(@one2five.map { |x| x + 1 })
|
87
|
+
@one2five.map(&'x -> x*x').should eql(@one2five.map { |x| x*x })
|
88
|
+
@one2five.inject(&'x y -> x*y').should eql(@one2five.inject { |x,y| x*y })
|
89
|
+
'x y -> x**y'.to_proc()[2,3].should eql(lambda { |x,y| x**y }[2,3])
|
90
|
+
'y x -> x**y'.to_proc()[2,3].should eql(lambda { |y,x| x**y }[2,3])
|
91
|
+
end
|
92
|
+
|
93
|
+
it "should handle chained arrows" do
|
94
|
+
'x -> y -> x**y'.to_proc()[2][3].should eql(lambda { |x| lambda { |y| x**y } }[2][3])
|
95
|
+
'x -> y z -> y**(z-x)'.to_proc()[1][2,3].should eql(lambda { |x| lambda { |y,z| y**(z-x) } }[1][2,3])
|
96
|
+
end
|
97
|
+
|
98
|
+
it "should handle the default parameter" do
|
99
|
+
@one2five.map(&'2**_/2').should eql(@one2five.map { |x| 2**x/2 })
|
100
|
+
@one2five.select(&'_%2==0').should eql(@one2five.select { |x| x%2==0 })
|
101
|
+
end
|
102
|
+
|
103
|
+
it "should handle point-free notation" do
|
104
|
+
@one2five.inject(&'*').should eql(@one2five.inject { |mem, var| mem * var })
|
105
|
+
@one2five.select(&'>2').should eql(@one2five.select { |x| x>2 })
|
106
|
+
@one2five.select(&'2<').should eql(@one2five.select { |x| 2<x })
|
107
|
+
@one2five.map(&'2*').should eql(@one2five.map { |x| 2*x })
|
108
|
+
(-3..3).map(&'.abs').should eql((-3..3).map { |x| x.abs })
|
109
|
+
end
|
110
|
+
|
111
|
+
it "should handle implied parameters as best it can" do
|
112
|
+
@one2five.inject(&'x*y').should eql(@one2five.inject(&'*'))
|
113
|
+
'x**y'.to_proc()[2,3].should eql(8)
|
114
|
+
'y**x'.to_proc()[2,3].should eql(8)
|
115
|
+
end
|
116
|
+
|
117
|
+
end
|
118
|
+
=end
|
119
|
+
|