quality_extensions 0.1.4 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/quality_extensions/all.rb +1 -1
- data/lib/quality_extensions/array/average.rb +2 -1
- data/lib/quality_extensions/array/classify.rb +3 -1
- data/lib/quality_extensions/array/expand_ranges.rb +3 -1
- data/lib/quality_extensions/array/group_by.rb +3 -1
- data/lib/quality_extensions/array/sequence.rb +2 -0
- data/lib/quality_extensions/array/shell_escape.rb +11 -6
- data/lib/quality_extensions/array/to_a_recursive.rb +1 -0
- data/lib/quality_extensions/array/to_query_string.rb +2 -0
- data/lib/quality_extensions/colored/toggleability.rb +2 -2
- data/lib/quality_extensions/console/command.rb +4 -3
- data/lib/quality_extensions/date/deprecated.rb +2 -0
- data/lib/quality_extensions/date/iso8601.rb +4 -1
- data/lib/quality_extensions/date/month_ranges.rb +2 -0
- data/lib/quality_extensions/dir/each_child.rb +1 -0
- data/lib/quality_extensions/exception/inspect_with_backtrace.rb +4 -2
- data/lib/quality_extensions/file/exact_match_regexp.rb +1 -0
- data/lib/quality_extensions/hash/assert_has_only_keys.rb +48 -0
- data/lib/quality_extensions/hash/to_date.rb +2 -0
- data/lib/quality_extensions/hash/to_query_string.rb +8 -2
- data/lib/quality_extensions/kernel/backtrace.rb +4 -2
- data/lib/quality_extensions/kernel/capture_output.rb +3 -2
- data/lib/quality_extensions/kernel/die.rb +4 -1
- data/lib/quality_extensions/kernel/example_printer.rb +3 -3
- data/lib/quality_extensions/kernel/remove_const.rb +3 -2
- data/lib/quality_extensions/kernel/remove_module.rb +3 -2
- data/lib/quality_extensions/kernel/require_all.rb +5 -3
- data/lib/quality_extensions/kernel/require_once.rb +1 -0
- data/lib/quality_extensions/kernel/simulate_input.rb +1 -0
- data/lib/quality_extensions/kernel/trap_chain.rb +3 -0
- data/lib/quality_extensions/module/alias_method_chain.rb +3 -15
- data/lib/quality_extensions/module/ancestry_of_instance_method.rb +19 -0
- data/lib/quality_extensions/module/basename.rb +5 -8
- data/lib/quality_extensions/module/bool_attr_accessor.rb +3 -1
- data/lib/quality_extensions/module/by_name.rb +76 -0
- data/lib/quality_extensions/module/class_methods.rb +2 -0
- data/lib/quality_extensions/module/create.rb +6 -5
- data/lib/quality_extensions/module/guard_method.rb +4 -1
- data/lib/quality_extensions/module/join.rb +2 -2
- data/lib/quality_extensions/module/malias_method_chain.rb +3 -2
- data/lib/quality_extensions/module/namespace.rb +1 -1
- data/lib/quality_extensions/module/parents.rb +2 -2
- data/lib/quality_extensions/module/remove_const.rb +3 -2
- data/lib/quality_extensions/module/split.rb +2 -1
- data/lib/quality_extensions/month.rb +2 -0
- data/lib/quality_extensions/mutex/if_available.rb +2 -0
- data/lib/quality_extensions/nil_method_missing.rb +227 -0
- data/lib/quality_extensions/object/ancestry_of_method.rb +2 -0
- data/lib/quality_extensions/object/if_else.rb +1 -1
- data/lib/quality_extensions/object/ignore_access.rb +3 -2
- data/lib/quality_extensions/object/mcall.rb +3 -1
- data/lib/quality_extensions/object/methods.rb +3 -2
- data/lib/quality_extensions/object/send_if.rb +2 -1
- data/lib/quality_extensions/object/singleton_send.rb +2 -0
- data/lib/quality_extensions/safe_nil.rb +3 -5
- data/lib/quality_extensions/string/digits_only.rb +2 -0
- data/lib/quality_extensions/string/each_char_with_index.rb +1 -0
- data/lib/quality_extensions/string/md5.rb +2 -0
- data/lib/quality_extensions/string/shell_escape.rb +4 -2
- data/lib/quality_extensions/string/to_underscored_label.rb +2 -0
- data/lib/quality_extensions/string/with_knowledge_of_color.rb +3 -0
- data/lib/quality_extensions/symbol/constantize.rb +2 -1
- data/lib/quality_extensions/symbol/match.rb +2 -1
- data/lib/quality_extensions/test/assert_anything.rb +1 -0
- data/lib/quality_extensions/test/difference_highlighting.rb +2 -2
- data/lib/quality_extensions/time/deprecated.rb +2 -0
- data/test/all.rb +8 -2
- metadata +86 -83
@@ -1,4 +1,4 @@
|
|
1
1
|
require File.dirname(__FILE__) + "/kernel/require_all"
|
2
2
|
require_all File.dirname(__FILE__),
|
3
|
-
:exclude =>
|
3
|
+
:exclude => %r{(^|/)test/|nil_method_missing.rb}, # Exclude files with side-effects: Don't include anything in test/ because those files will include test/unit, which causes tests to automatically be run
|
4
4
|
:exclude_files => 'all.rb'
|
@@ -3,7 +3,7 @@
|
|
3
3
|
# Copyright:: Copyright (c) 2007 QualitySmith, Inc.
|
4
4
|
# License:: Ruby License
|
5
5
|
# Submit to Facets?:: Yes.
|
6
|
-
# Wait, so Facets has mode (http://facets.rubyforge.org/src/doc/rdoc/
|
6
|
+
# Wait, so Facets has mode (http://facets.rubyforge.org/src/doc/rdoc/classes/Enumerable.html#M001253) but it doesn't have mean/average?
|
7
7
|
# Whether or not this Array#average is included, Facets ought to have an Enumerable#mean/average similar to mode that uses each iterator rather than Array#size. (Still might want to keep this version if it's more efficient for Arrays?)
|
8
8
|
#++
|
9
9
|
|
@@ -29,6 +29,7 @@ end
|
|
29
29
|
#
|
30
30
|
=begin test
|
31
31
|
require 'test/unit'
|
32
|
+
|
32
33
|
class TheTest < Test::Unit::TestCase
|
33
34
|
def test_average
|
34
35
|
assert_equal 2, [0, 4].average
|
@@ -10,9 +10,10 @@
|
|
10
10
|
# column from the array, which can be nice, since the classification key in the hash makes it somewhat redundant.
|
11
11
|
#++
|
12
12
|
|
13
|
+
$LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', '..')
|
13
14
|
require 'rubygems'
|
14
15
|
gem 'facets'
|
15
|
-
require '
|
16
|
+
require 'facets/to_hash'
|
16
17
|
class Array
|
17
18
|
|
18
19
|
=begin rdoc
|
@@ -51,6 +52,7 @@ end
|
|
51
52
|
# |_|\___||___/\__|
|
52
53
|
#
|
53
54
|
=begin test
|
55
|
+
require 'test/unit'
|
54
56
|
require 'set'
|
55
57
|
|
56
58
|
class TheTest < Test::Unit::TestCase
|
@@ -5,8 +5,9 @@
|
|
5
5
|
# Submit to Facets?:: Yes.
|
6
6
|
#++
|
7
7
|
|
8
|
+
$LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', '..')
|
8
9
|
require 'rubygems'
|
9
|
-
require 'facets/
|
10
|
+
require 'facets/kernel/silence'
|
10
11
|
|
11
12
|
class Array
|
12
13
|
# Expands (calls +to_a+ on) all Ranges contained in this array, replacing the range with the list of *elements* that the range represents.
|
@@ -39,6 +40,7 @@ end
|
|
39
40
|
#
|
40
41
|
=begin test
|
41
42
|
require 'test/unit'
|
43
|
+
|
42
44
|
class TheTest < Test::Unit::TestCase
|
43
45
|
def test_1
|
44
46
|
assert_equal [1, 2, 3], [1, 2, 3].expand_ranges
|
@@ -10,9 +10,10 @@
|
|
10
10
|
# *not* in "table" form (whose elements are *not* all arrays of equal size and might not even be *arrays*).
|
11
11
|
#++
|
12
12
|
|
13
|
+
$LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', '..')
|
13
14
|
require 'rubygems'
|
14
15
|
gem 'facets'
|
15
|
-
require '
|
16
|
+
require 'facets/array/delete'
|
16
17
|
class Array
|
17
18
|
|
18
19
|
=begin rdoc
|
@@ -71,6 +72,7 @@ end
|
|
71
72
|
# |_|\___||___/\__|
|
72
73
|
#
|
73
74
|
=begin test
|
75
|
+
require 'test/unit'
|
74
76
|
require 'set'
|
75
77
|
|
76
78
|
class TheTest < Test::Unit::TestCase
|
@@ -5,14 +5,16 @@
|
|
5
5
|
# Submit to Facets?:: Yes.
|
6
6
|
#++
|
7
7
|
|
8
|
+
$LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', '..')
|
8
9
|
require 'rubygems'
|
9
|
-
require 'facets/
|
10
|
-
require 'facets/
|
10
|
+
require 'facets/ruby' # to_proc
|
11
|
+
require 'facets/kernel/load'
|
11
12
|
require_local '../string/shell_escape.rb'
|
12
13
|
|
13
14
|
class Array
|
14
15
|
def shell_escape
|
15
|
-
self.map(&:shell_escape)
|
16
|
+
#self.map(&:shell_escape)
|
17
|
+
Escape.shell_command(self)
|
16
18
|
end
|
17
19
|
end
|
18
20
|
|
@@ -24,13 +26,16 @@ end
|
|
24
26
|
#
|
25
27
|
=begin test
|
26
28
|
require 'test/unit'
|
29
|
+
|
27
30
|
class TheTest < Test::Unit::TestCase
|
28
31
|
def test_1
|
29
|
-
assert_equal
|
32
|
+
assert_equal 'a', ['a'].shell_escape.to_s
|
30
33
|
end
|
31
34
|
def test_2
|
32
|
-
assert_equal ["arg1", "'multiple words for single argument'"],
|
33
|
-
|
35
|
+
#assert_equal ["arg1", "'multiple words for single argument'"],
|
36
|
+
# ['arg1', 'multiple words for single argument'].shell_escape.to_s
|
37
|
+
assert_equal "arg1 'multiple words for single argument'",
|
38
|
+
['arg1', 'multiple words for single argument'].shell_escape.to_s
|
34
39
|
end
|
35
40
|
end
|
36
41
|
=end
|
@@ -6,12 +6,12 @@
|
|
6
6
|
# Developer notes::
|
7
7
|
#++
|
8
8
|
|
9
|
+
$LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', '..')
|
9
10
|
require 'rubygems'
|
10
11
|
gem 'colored'
|
11
12
|
require 'colored'
|
12
13
|
gem 'facets'
|
13
|
-
require 'facets/
|
14
|
-
gem 'quality_extensions'
|
14
|
+
require 'facets/module/alias'
|
15
15
|
require 'quality_extensions/module/guard_method'
|
16
16
|
|
17
17
|
class String
|
@@ -29,9 +29,10 @@
|
|
29
29
|
# Copyright:: Copyright (c) 2005-2007
|
30
30
|
# License:: Ruby License
|
31
31
|
|
32
|
+
$LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', '..')
|
32
33
|
require 'shellwords'
|
33
34
|
require 'rubygems'
|
34
|
-
require '
|
35
|
+
require 'facets/style' #modulize
|
35
36
|
require 'escape' # http://www.a-k-r.org/escape/
|
36
37
|
|
37
38
|
# TODO Test
|
@@ -279,7 +280,7 @@ class Console::Command
|
|
279
280
|
# Development notes:
|
280
281
|
# * Currently requires you to pass the subcommand module's "self" to this method. I didn't know of a better way to cause it to create the instance methods in *that* module rather than here in Console::Command.
|
281
282
|
# * Possible alternatives:
|
282
|
-
# * Binding.of_caller() (http://facets.rubyforge.org/src/doc/rdoc/
|
283
|
+
# * Binding.of_caller() (http://facets.rubyforge.org/src/doc/rdoc/classes/Binding.html) -- wary of using it if it depends on Continuations, which I understand are deprecated
|
283
284
|
# * copy the pass_through class method to each subcommand module so that calls will be in the module's context...
|
284
285
|
def pass_through(options, mod)
|
285
286
|
options.each do |method_names, arity|
|
@@ -396,7 +397,7 @@ class Console::Command
|
|
396
397
|
|
397
398
|
# Extend subcommand option module
|
398
399
|
#subconst = subcommand.gsub(/\W/,'_').capitalize
|
399
|
-
subconst = @subcommand.modulize
|
400
|
+
subconst = @subcommand.style(:modulize)
|
400
401
|
#p self.class.constants if $debug
|
401
402
|
if self.class.const_defined?(subconst)
|
402
403
|
puts "Extending self (#{self.class}) with subcommand module #{subconst}" if $debug
|
@@ -5,9 +5,10 @@
|
|
5
5
|
# Submit to Facets?:: Yes.
|
6
6
|
#++
|
7
7
|
|
8
|
+
$LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', '..')
|
8
9
|
require 'date'
|
9
10
|
require 'rubygems'
|
10
|
-
require 'facets/
|
11
|
+
require 'facets/date'
|
11
12
|
|
12
13
|
class Date
|
13
14
|
def iso8601
|
@@ -23,6 +24,8 @@ end
|
|
23
24
|
# |_|\___||___/\__|
|
24
25
|
#
|
25
26
|
=begin test
|
27
|
+
require 'test/unit'
|
28
|
+
|
26
29
|
class TheTest < Test::Unit::TestCase
|
27
30
|
def test_iso8601
|
28
31
|
assert_equal '2006-07-18', Date.civil(2006, 7, 18).iso8601()
|
@@ -7,8 +7,9 @@
|
|
7
7
|
# * Add depth argument to inspect()?
|
8
8
|
#++
|
9
9
|
|
10
|
+
$LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', '..')
|
10
11
|
require 'rubygems'
|
11
|
-
require 'facets/
|
12
|
+
require 'facets/module/alias'
|
12
13
|
|
13
14
|
class Exception
|
14
15
|
# Use this if you want to output an exception with all the details that you'd *normally* see if the exception went unrescued
|
@@ -33,8 +34,9 @@ end
|
|
33
34
|
# |_|\___||___/\__|
|
34
35
|
#
|
35
36
|
=begin test
|
37
|
+
require 'test/unit'
|
36
38
|
require 'rubygems'
|
37
|
-
require 'facets/
|
39
|
+
require 'facets/ruby' # lines
|
38
40
|
|
39
41
|
class TheTest < Test::Unit::TestCase
|
40
42
|
def raise_an_error(arg = nil)
|
@@ -0,0 +1,48 @@
|
|
1
|
+
#--
|
2
|
+
# Author:: Trans?
|
3
|
+
# Copyright:: Copyright (c) Trans?
|
4
|
+
# License:: Ruby License
|
5
|
+
# Submit to Facets?:: No. Copied from facets-1.8.54/lib/facets/core/hash/assert_has_only_keys.rb. No longer exists in 2.4.1.
|
6
|
+
# Developer notes::
|
7
|
+
#++
|
8
|
+
|
9
|
+
$LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', '..')
|
10
|
+
require 'rubygems'
|
11
|
+
require 'facets/hash/keys'
|
12
|
+
|
13
|
+
class Hash
|
14
|
+
|
15
|
+
# Returns true is hash has only then given keys,
|
16
|
+
# otherwise throws an ArgumentError.
|
17
|
+
#
|
18
|
+
# h = { :a => 1, :b => 2 }
|
19
|
+
# h.assert_has_only_keys( :a, :b ) #=> true
|
20
|
+
# h.assert_has_only_keys( :a ) #=> ArgumentError
|
21
|
+
#
|
22
|
+
def assert_has_only_keys(*check_keys)
|
23
|
+
raise(ArgumentError, "has unexpected key(s)") unless has_only_keys?(*check_keys)
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
# _____ _
|
30
|
+
# |_ _|__ ___| |_
|
31
|
+
# | |/ _ \/ __| __|
|
32
|
+
# | | __/\__ \ |_
|
33
|
+
# |_|\___||___/\__|
|
34
|
+
#
|
35
|
+
=begin test
|
36
|
+
|
37
|
+
require 'test/unit'
|
38
|
+
|
39
|
+
class TCHash < Test::Unit::TestCase
|
40
|
+
|
41
|
+
def test_assert_has_only_keys
|
42
|
+
assert_nothing_raised { { :a=>1,:b=>2,:c=>3 }.assert_has_only_keys(:a,:b,:c) }
|
43
|
+
assert_raises( ArgumentError ) { { :a=>1,:b=>2,:c=>3 }.assert_has_only_keys(:a,:b) }
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
=end
|
@@ -5,9 +5,10 @@
|
|
5
5
|
# Submit to Facets?:: Yes.
|
6
6
|
#++
|
7
7
|
|
8
|
+
$LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', '..')
|
8
9
|
autoload :CGI, 'cgi'
|
9
10
|
require 'rubygems'
|
10
|
-
require 'facets/
|
11
|
+
require 'facets/kernel/load'
|
11
12
|
require_local '../array/to_query_string.rb'
|
12
13
|
|
13
14
|
class Hash
|
@@ -69,6 +70,10 @@ end
|
|
69
70
|
# |_|\___||___/\__|
|
70
71
|
#
|
71
72
|
=begin test
|
73
|
+
require 'test/unit'
|
74
|
+
require 'rubygems'
|
75
|
+
require 'set'
|
76
|
+
|
72
77
|
class TheTest < Test::Unit::TestCase
|
73
78
|
def test_hash_to_query_string_nesting
|
74
79
|
data = {
|
@@ -81,7 +86,8 @@ class TheTest < Test::Unit::TestCase
|
|
81
86
|
}
|
82
87
|
}
|
83
88
|
}
|
84
|
-
assert_equal 'foo=bar
|
89
|
+
assert_equal ['foo=bar', 'names[common]=smith', 'names[uncommon][first]=lance', 'names[uncommon][last]=wilheiminkauf'].to_set,
|
90
|
+
data.to_query_string.split(/&/).to_set
|
85
91
|
end
|
86
92
|
def test_hash_to_query_string_nesting_2
|
87
93
|
data = {
|
@@ -5,8 +5,6 @@
|
|
5
5
|
# Submit to Facets?:: Not sure. This might not be necessary if caller() actually works reliably.
|
6
6
|
#++
|
7
7
|
|
8
|
-
require "rubygems"
|
9
|
-
require "facet/string/lines"
|
10
8
|
|
11
9
|
module Kernel
|
12
10
|
# Equivalent to calling caller(0)
|
@@ -40,6 +38,10 @@ end
|
|
40
38
|
# |_|\___||___/\__|
|
41
39
|
#
|
42
40
|
=begin test
|
41
|
+
require 'test/unit'
|
42
|
+
require "rubygems"
|
43
|
+
require "facets/ruby" # lines
|
44
|
+
|
43
45
|
class TheTest < Test::Unit::TestCase
|
44
46
|
def test_1_level
|
45
47
|
assert_match /^.*backtrace.rb:\d*:in `test_1_level'$/, backtrace[0]
|
@@ -7,7 +7,7 @@
|
|
7
7
|
|
8
8
|
# :todo: Can we find a simpler way to do this based on facets' silence_stream?
|
9
9
|
#
|
10
|
-
# File lib/facets/
|
10
|
+
# File lib/facets/kernel/silence_stream.rb, line 13
|
11
11
|
# def silence_stream(stream)
|
12
12
|
# old_stream = stream.dup
|
13
13
|
# stream.reopen(RUBY_PLATFORM =~ /mswin/ ? 'NUL:' : '/dev/null')
|
@@ -17,9 +17,10 @@
|
|
17
17
|
# stream.reopen(old_stream)
|
18
18
|
# end
|
19
19
|
|
20
|
+
$LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', '..')
|
20
21
|
require 'stringio'
|
21
22
|
require 'rubygems'
|
22
|
-
require 'facets/
|
23
|
+
require 'facets/dictionary'
|
23
24
|
|
24
25
|
module Kernel
|
25
26
|
|
@@ -6,6 +6,7 @@
|
|
6
6
|
# Deprecated. Because I discovered Kernel::abort !
|
7
7
|
#++
|
8
8
|
|
9
|
+
$LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', '..')
|
9
10
|
module Kernel
|
10
11
|
def die(message, exit_code = 1)
|
11
12
|
$stderr.puts message
|
@@ -20,9 +21,11 @@ end
|
|
20
21
|
# |_|\___||___/\__|
|
21
22
|
#
|
22
23
|
=begin test
|
24
|
+
$LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', '..')
|
25
|
+
require 'test/unit'
|
23
26
|
require 'rubygems'
|
24
27
|
require 'quality_extensions/kernel/capture_output'
|
25
|
-
#require 'facets/
|
28
|
+
#require 'facets/kernel/load'
|
26
29
|
#require_local './capture_output'
|
27
30
|
|
28
31
|
class TheTest < Test::Unit::TestCase
|
@@ -11,8 +11,9 @@
|
|
11
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
12
|
#++
|
13
13
|
|
14
|
+
$LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', '..')
|
14
15
|
require 'rubygems'
|
15
|
-
#require 'facets/
|
16
|
+
#require 'facets/binding/self/of_caller'
|
16
17
|
|
17
18
|
# This was written because the irb/xmp that was already available seemed to be
|
18
19
|
# needlessly complex and needlessly dependent upon "irb" stuff. This
|
@@ -57,9 +58,8 @@ include ExamplePrinter
|
|
57
58
|
=begin test
|
58
59
|
require 'test/unit'
|
59
60
|
require 'rubygems'
|
60
|
-
gem 'quality_extensions'
|
61
61
|
require 'quality_extensions/kernel/capture_output'
|
62
|
-
require 'facets/
|
62
|
+
require 'facets/string/tab'
|
63
63
|
|
64
64
|
class TheTest < Test::Unit::TestCase
|
65
65
|
def test_puts_statement
|