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,2 @@
1
+ require File.dirname(__FILE__) + "/../kernel/require_all"
2
+ require_all File.dirname(__FILE__), :exclude_files => 'all.rb'
@@ -0,0 +1,40 @@
1
+ #--
2
+ # Author:: Tyler Rick
3
+ # Copyright:: Copyright (c) 2007 QualitySmith, Inc.
4
+ # License:: Ruby License
5
+ # Submit to Facets?:: No!
6
+ #++
7
+
8
+ # Depends on some niceties from ActiveSupport (which really should be in core Ruby but aren't)...
9
+ require "rubygems"
10
+ require "active_support"
11
+ require "pp"
12
+
13
+ class Date
14
+ # These should be moved elsewhere because they are subjective and depend on the context where they're used.
15
+ def date_for_report
16
+ strftime("%b %d, %Y") # Example: "Jun 18, 2006"
17
+ end
18
+ def month_for_report
19
+ strftime("%B %Y") # Example: "June 2006"
20
+ end
21
+ end
22
+
23
+ # _____ _
24
+ # |_ _|__ ___| |_
25
+ # | |/ _ \/ __| __|
26
+ # | | __/\__ \ |_
27
+ # |_|\___||___/\__|
28
+ #
29
+ =begin test
30
+ class TheTest < Test::Unit::TestCase
31
+ def test_date_for_report
32
+ assert_equal 'Jun 18, 2006', Date.new(2006, 6, 18).date_for_report()
33
+ assert_equal 'Jun 03, 2006', Date.new(2006, 6, 3).date_for_report()
34
+ end
35
+
36
+ def test_month_for_report
37
+ assert_equal 'June 2006', Date.new(2006, 6).month_for_report()
38
+ end
39
+ end
40
+ =end
@@ -0,0 +1,31 @@
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 'date'
9
+ require 'rubygems'
10
+ require 'facets/core/date/to_time'
11
+
12
+ class Date
13
+ def iso8601
14
+ # Useful for SQL dates, among other things
15
+ to_time().iso8601()[0..9]
16
+ end
17
+ end
18
+
19
+ # _____ _
20
+ # |_ _|__ ___| |_
21
+ # | |/ _ \/ __| __|
22
+ # | | __/\__ \ |_
23
+ # |_|\___||___/\__|
24
+ #
25
+ =begin test
26
+ class TheTest < Test::Unit::TestCase
27
+ def test_iso8601
28
+ assert_equal '2006-07-18', Date.civil(2006, 7, 18).iso8601()
29
+ end
30
+ end
31
+ =end
@@ -0,0 +1,122 @@
1
+ #--
2
+ # Author:: Tyler Rick
3
+ # Copyright:: Copyright (c) 2007 QualitySmith, Inc.
4
+ # License:: Ruby License
5
+ # Submit to Facets?:: Not sure.
6
+ #++
7
+
8
+ # Depends on some niceties from ActiveSupport (which really should be in core Ruby but aren't)... Date.new(a, b, c)
9
+ require "rubygems"
10
+ require "active_support"
11
+
12
+ # Attempts in part to make the Date class do everything (or at least some of the things) that the Time class can do (ActiveSupport::CoreExtensions::Time::Calculations).
13
+ # Maybe that would be better accomplished with a method_missing() that calls to_time.send(:the_same_method) if Time.respond_to?(:that_method).
14
+ class Date
15
+
16
+ # This is based on the implementation of Time.step. The main difference is that it uses
17
+ # >>= (increment by 1 month) instead of += (increment by 1 day).
18
+ def month_step(max, step, &block) # { |date| ...}
19
+ time = self
20
+ op = [:-,:<=,:>=][step<=>0]
21
+ while time.__send__(op, max)
22
+ block.call time
23
+ time >>= step
24
+ end
25
+ self
26
+ end
27
+
28
+ # Step forward one month at a time until we reach max (inclusive), yielding each date as we go
29
+ def months_upto(max, &block) # { |date| ...}
30
+ month_step(max, +1, &block)
31
+ end
32
+
33
+ def to_month
34
+ Month.new(year, month)
35
+ end
36
+
37
+ def next_month
38
+ # Uses http://api.rubyonrails.org/classes/ActiveSupport/CoreExtensions/Time/Calculations.html#M000336
39
+ self.to_time.next_month
40
+ end
41
+
42
+ end
43
+
44
+ # _____ _
45
+ # |_ _|__ ___| |_
46
+ # | |/ _ \/ __| __|
47
+ # | | __/\__ \ |_
48
+ # |_|\___||___/\__|
49
+ #
50
+ =begin test
51
+ class TheTest < Test::Unit::TestCase
52
+
53
+ #-------------------------------------------------------------------------------------------------
54
+ # Ranges, step, and upto for *days*
55
+ # (This is built-in behavior.)
56
+
57
+ def test_step
58
+ list = []
59
+ collect_as_array = lambda do |date|
60
+ list << date
61
+ end
62
+
63
+ list = []
64
+ Date.new(2006, 6, 1).step(Date.new(2006, 6, 3), 1, &collect_as_array)
65
+ assert_equal [
66
+ Date.new(2006, 6, 1),
67
+ Date.new(2006, 6, 2),
68
+ Date.new(2006, 6, 3)
69
+ ],
70
+ list
71
+ end
72
+
73
+ def test_range
74
+ list = Date.new(2006, 6, 1)..Date.new(2006, 6, 3)
75
+ assert_equal Range.new(Date.new(2006, 6, 1), Date.new(2006, 6, 3)), list
76
+ end
77
+
78
+ #-------------------------------------------------------------------------------------------------
79
+ # Ranges, step, and upto for *months*
80
+
81
+ def test_month_step
82
+ list = []
83
+ collect_as_array = lambda do |date|
84
+ list << date
85
+ end
86
+
87
+ list = []
88
+ Date.new(2006, 6, 1).month_step(Date.new(2006, 7, 1), 1, &collect_as_array)
89
+ assert_equal [
90
+ Date.new(2006, 6, 1),
91
+ Date.new(2006, 7, 1)
92
+ ],
93
+ list
94
+
95
+ # Test that it ignores days
96
+ list = []
97
+ Date.new(2006, 6, 1).month_step(Date.new(2006, 8, 31), 1, &collect_as_array)
98
+ assert_equal [
99
+ Date.new(2006, 6, 1),
100
+ Date.new(2006, 7, 1),
101
+ Date.new(2006, 8, 1)
102
+ ],
103
+ list
104
+ end
105
+
106
+ def test_months_upto
107
+ list = []
108
+ collect_as_array = lambda do |date|
109
+ list << date
110
+ end
111
+
112
+ list = []
113
+ Date.new(2006, 6, 1).months_upto(Date.new(2006, 7, 1), &collect_as_array)
114
+ assert_equal [
115
+ Date.new(2006, 6, 1),
116
+ Date.new(2006, 7, 1)
117
+ ],
118
+ list
119
+ end
120
+ end
121
+ =end
122
+
@@ -0,0 +1,58 @@
1
+ #--
2
+ # Author:: Nolan Cafferky
3
+ # Copyright:: Copyright (c) 2007 QualitySmith, Inc.
4
+ # License:: Ruby License
5
+ # Submit to Facets?:: Yes.
6
+ #++
7
+
8
+
9
+ class Dir
10
+ # Much like each(), except the "." and ".." special files
11
+ # are ignored.
12
+ def each_child
13
+ each do |file|
14
+ yield file if file != "." and file != ".."
15
+ end
16
+ end
17
+ end
18
+
19
+
20
+ # _____ _
21
+ # |_ _|__ ___| |_
22
+ # | |/ _ \/ __| __|
23
+ # | | __/\__ \ |_
24
+ # |_|\___||___/\__|
25
+ #
26
+ =begin test
27
+
28
+ require 'fileutils'
29
+
30
+ class TheTest < Test::Unit::TestCase
31
+ def setup
32
+ @base_path = "dir_extensions_test_test_each_child"
33
+ make_test_files @base_path
34
+ end
35
+ def teardown
36
+ FileUtils.remove_entry_secure @base_path
37
+ end
38
+
39
+ def test_each_child
40
+ Dir.open(@base_path) do |d|
41
+ results = []
42
+ d.each_child { |file| results << file }
43
+ assert_equal 3, results.size
44
+ assert results.include?("foo")
45
+ assert results.include?("bar")
46
+ assert results.include?("foobar")
47
+ end
48
+ end
49
+
50
+ def make_test_files base_path
51
+ Dir.mkdir( base_path)
52
+ FileUtils.touch(base_path + "/foo")
53
+ FileUtils.touch(base_path + "/bar")
54
+ Dir.mkdir( base_path + "/foobar")
55
+ FileUtils.touch(base_path + "/foobar/baz")
56
+ end
57
+ end
58
+ =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
+ #++
7
+
8
+ require 'enumerator'
9
+ module Enumerable
10
+
11
+ # The core Enumerable module provides the following enumerator methods;
12
+ # * <tt>enum_cons()</tt>
13
+ # * <tt>enum_slice()</tt>
14
+ # * <tt>enum_with_index()</tt>
15
+ # but for some reason they didn't provide a generic <tt>enum()</tt> method for the cases they didn't think of!
16
+ #
17
+ # +enum+ lets you turn *any* iterator into a general-purpose <tt>Enumerator</tt>, which, according to the RDocs, is
18
+ # "A class which provides a method `<tt>each</tt>' to be used as an <tt>Enumerable</tt> object."
19
+ #
20
+ # This lets you turn any '<tt>each'-type</tt> iterator (<tt>each_byte</tt>, <tt>each_line</tt>, ...) into a
21
+ # '<tt>map</tt>'-type iterator (one that returns a collection), or into an array, etc.
22
+ #
23
+ # So if an object responds to <tt>:each_line</tt> but not to <tt>:map_lines</tt> or <tt>:lines</tt>, you could just do:
24
+ # object.enum(:each_line).map { block }
25
+ # object.enum(:each_line).min
26
+ # object.enum(:each_line).grep /pattern/
27
+ # lines = object.enum(:each_line).to_a
28
+ #
29
+ # If no iterator is specified, <tt>:each</tt> is assumed:
30
+ # object.enum.map { block }
31
+ #
32
+ # More examples:
33
+ # Dir.new('.').enum.to_a
34
+ # #=> ['file1', 'file2']
35
+ #
36
+ # "abc".enum(:each_byte).map{|byte| byte.chr.upcase}
37
+ # #=> ["A", "B", "C"]
38
+ #
39
+ def enum(iterator = :each)
40
+ Enumerable::Enumerator.new(self, iterator)
41
+ end
42
+
43
+ end
44
+
45
+ # _____ _
46
+ # |_ _|__ ___| |_
47
+ # | |/ _ \/ __| __|
48
+ # | | __/\__ \ |_
49
+ # |_|\___||___/\__|
50
+ #
51
+ =begin test
52
+ require 'test/unit'
53
+
54
+ class TheTest < Test::Unit::TestCase
55
+ def test_1
56
+ # @options.enum(:each).map { |key, value|
57
+ # values = [value].flatten
58
+ # key +
59
+ # (values.empty? ? " #{flatten.join(' ')}" : '')
60
+ # }.join(' ')
61
+
62
+ # Yes we could use the built-in Array#map method, but...not every class that provides iterators (each, ...) provides a map().
63
+ assert_equal ['A', 'B', 'C'], ['a', 'b', 'c'].enum(:each).map {|v| v.upcase}
64
+ end
65
+ def test_2
66
+ assert Dir.new('.').enum.to_a.size > 0
67
+ end
68
+ end
69
+ =end
@@ -0,0 +1,4 @@
1
+ require 'rubygems'
2
+ # Alias for:
3
+ require 'qualitysmith_extensions/enumerable/select_while'
4
+
@@ -0,0 +1,109 @@
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
+
11
+ module Enumerable
12
+ # Returns an array containing all _consecutive_ elements of +enum+ for which +block+ is not false, starting at the first element.
13
+ # So it is very much like select, only it stops searching as soon as <tt>block</tt> ceases to be true. (That means it will stop searching immediately if the first element doesn't match.)
14
+ #
15
+ # This might be preferable to +select+, for example, if:
16
+ # * you have a very large collection of elements
17
+ # * the desired elements are expected to all be consecutively occuring and are all at the beginning of the collection
18
+ # * it would be costly to continue iterating all the way to the very end
19
+ #
20
+ # This is probably only useful for collections that have some kind of predictable ordering (such as Arrays).
21
+ #
22
+ # AKA: select_top_elements_that_match
23
+ #
24
+ def select_until(inclusive = false, &block)
25
+ selected = []
26
+ inclusive ? (
27
+ each do |item|
28
+ selected << item
29
+ break if block.call(item)
30
+ end
31
+ ) : (
32
+ each do |item|
33
+ break if block.call(item)
34
+ selected << item
35
+ end
36
+ )
37
+ selected
38
+ end
39
+
40
+ def select_while(&block)
41
+ selected = []
42
+ each do |item|
43
+ break if !block.call(item)
44
+ selected << item
45
+ end
46
+ selected
47
+ end
48
+ end
49
+
50
+
51
+
52
+
53
+
54
+ # _____ _
55
+ # |_ _|__ ___| |_
56
+ # | |/ _ \/ __| __|
57
+ # | | __/\__ \ |_
58
+ # |_|\___||___/\__|
59
+ #
60
+ =begin test
61
+ require 'test/unit'
62
+
63
+ class TheTest < Test::Unit::TestCase
64
+ def test_1
65
+ assert_equal [1, 2], (1..4).select_while {|i| i <= 2}
66
+ assert_equal [1, 2], (1..4).select_until {|i| i == 3}
67
+ end
68
+
69
+ def test_not_same_as_select
70
+ # Ah, yes, it behaves the same as select in *this* simple case:
71
+ assert_equal [1, 2], (1..4).select {|i| i <= 2}
72
+
73
+ # But what about _this_ one... hmm?
74
+ assert_equal [1, 2], [1, 2, 3, 2, 1].select_while {|i| i <= 2}
75
+ assert_equal [1, 2, 2, 1], [1, 2, 3, 2, 1].select {|i| i <= 2} # Not the same! Keyword: _consecutive_.
76
+
77
+ # Or _this_ one...
78
+ assert_equal [1, 2, 1], [1, 2, 1, 99, 2].select_while {|i| i <= 2}
79
+ assert_equal [1, 2], [1, 2, 1, 99, 2].select {|i| i <= 2}.uniq # Even this isn't the same.
80
+ end
81
+
82
+ def test_inclusive_option
83
+ assert_equal [
84
+ 'def cabbage',
85
+ ' :cabbage',
86
+ ], [
87
+ 'def cabbage',
88
+ ' :cabbage',
89
+ 'end',
90
+ ].select_until {|line| line =~ /end/}
91
+ # Not far enough. We actually want to *include* that last element.
92
+
93
+ assert_equal [
94
+ 'def cabbage',
95
+ ' :cabbage',
96
+ 'end',
97
+ ], [
98
+ 'def cabbage',
99
+ ' :cabbage',
100
+ 'end',
101
+ 'def carrot',
102
+ ' :carrot',
103
+ 'end',
104
+ ].select_until(true) {|line| line =~ /end/}
105
+ end
106
+ end
107
+ =end
108
+
109
+