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,10 @@
1
+
2
+ # mattr_accessor :already_included
3
+ # def self.already_included
4
+ # @@already_included ||= false
5
+ # end
6
+ #
7
+ # def self.included(base_module)
8
+ # return if @@already_included
9
+ # @@already_included = true
10
+ #
@@ -0,0 +1,66 @@
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
+ require 'rubygems'
12
+ require 'facets/core/symbol/to_proc'
13
+ require 'qualitysmith_extensions/symbol/constantize'
14
+ require 'qualitysmith_extensions/module/namespace' # dirname
15
+ require 'qualitysmith_extensions/module/basename'
16
+
17
+ class Module
18
+ # Joins pieces of a "module path" together in the same sense that <tt>File.join</tt> joins pieces of a _filesystem_ path.
19
+ #
20
+ # See also <tt>Module.dirname</tt>/<tt>Module.namespace_name_of</tt> and <tt>Module.basename</tt>.
21
+ #
22
+ # These can be used together, such that the following is always true:
23
+ # OuterModule::MiddleModule::InnerModule == Module.join(Module.dirname(some_module), Module.basename(some_module)).constantize
24
+ #
25
+ def self.join(*path_parts)
26
+ path_parts.map(&:to_s).join('::')
27
+ end
28
+ end
29
+
30
+
31
+
32
+
33
+ # _____ _
34
+ # |_ _|__ ___| |_
35
+ # | |/ _ \/ __| __|
36
+ # | | __/\__ \ |_
37
+ # |_|\___||___/\__|
38
+ #
39
+ =begin test
40
+ require 'test/unit'
41
+
42
+ module OuterModule; end
43
+ module OuterModule::MiddleModule; end
44
+ module OuterModule::MiddleModule::InnerModule; end
45
+
46
+ class JoinTest < Test::Unit::TestCase
47
+ def test_join
48
+ assert_equal 'OuterModule::MiddleModule::InnerModule',
49
+ Module.join('OuterModule', 'MiddleModule', 'InnerModule')
50
+ end
51
+ end
52
+
53
+ class TeamworkTest < Test::Unit::TestCase
54
+ def test_join
55
+ assert_equal ['OuterModule::MiddleModule', 'InnerModule'],
56
+ [Module.dirname(OuterModule::MiddleModule::InnerModule), Module.basename(OuterModule::MiddleModule::InnerModule)]
57
+ assert_equal 'OuterModule::MiddleModule::InnerModule',
58
+ Module.join(Module.dirname(OuterModule::MiddleModule::InnerModule), Module.basename(OuterModule::MiddleModule::InnerModule))
59
+ assert_equal OuterModule::MiddleModule::InnerModule,
60
+ Module.join(Module.dirname(OuterModule::MiddleModule::InnerModule), Module.basename(OuterModule::MiddleModule::InnerModule)).constantize
61
+ end
62
+ end
63
+ =end
64
+
65
+
66
+
@@ -0,0 +1,92 @@
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
+ gem 'facets'
12
+ require 'facets/core/kernel/singleton_class'
13
+ require 'qualitysmith_extensions/module/alias_method_chain'
14
+
15
+ class Module
16
+
17
+ # Same as <tt>Module#alias_method_chain</tt>, only it works for modules/classes
18
+ #
19
+ # class X
20
+ # def self.foo
21
+ # 'foo'
22
+ # end
23
+ # malias_method_chain :foo, :feature
24
+ # end
25
+ #
26
+ # Note: You could always do the same thing with <tt>Module#alias_method_chain</tt> by simply doing this:
27
+ #
28
+ # class << self
29
+ # alias_method_chain :foo, :feature
30
+ # end
31
+ #
32
+ def malias_method_chain(target, feature, *args)
33
+ # Strip out punctuation on predicates or bang methods since
34
+ # e.g. target?_without_feature is not a valid method name.
35
+
36
+ singleton_class.instance_eval do
37
+ alias_method_chain target, feature, *args
38
+ end
39
+ end
40
+
41
+ end
42
+
43
+
44
+ # _____ _
45
+ # |_ _|__ ___| |_
46
+ # | |/ _ \/ __| __|
47
+ # | | __/\__ \ |_
48
+ # |_|\___||___/\__|
49
+ #
50
+ =begin test
51
+ require 'test/unit'
52
+
53
+ class TestHowYouWouldDoItWithPlain_alias_method_chain < Test::Unit::TestCase
54
+
55
+ class X
56
+ def self.foo
57
+ 'foo'
58
+ end
59
+ def self.foo_with_feature
60
+ foo_without_feature + '_with_feature'
61
+ end
62
+ class << self
63
+ alias_method_chain :foo, :feature
64
+ end
65
+ end
66
+
67
+ def test_001
68
+ assert_equal 'foo_with_feature', X.foo
69
+ end
70
+
71
+ end
72
+
73
+ class Test_malias_method_chain < Test::Unit::TestCase
74
+
75
+ class Y
76
+ def self.foo
77
+ 'foo'
78
+ end
79
+ def self.foo_with_feature
80
+ foo_without_feature + '_with_feature'
81
+ end
82
+ malias_method_chain :foo, :feature
83
+ end
84
+
85
+ def test_001
86
+ assert_equal 'foo_with_feature', Y.foo
87
+ end
88
+
89
+ end
90
+
91
+ =end
92
+
@@ -0,0 +1,4 @@
1
+ require 'rubygems'
2
+ # Alias for:
3
+ require 'qualitysmith_extensions/module/class_methods'
4
+
@@ -0,0 +1,112 @@
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
+ # * 0.0.52: Renamed namespace to namespace_module to avoid conflicting with Facets' Module#namespace and Rake's namespace
9
+ #++
10
+
11
+
12
+ require 'rubygems'
13
+ require 'qualitysmith_extensions/symbol/constantize'
14
+ require 'qualitysmith_extensions/module/split'
15
+
16
+
17
+ class Module
18
+ # Return the module which contains this one; if this is a root module, such as
19
+ # +::MyModule+, then Object is returned.
20
+ def namespace_module
21
+ namespace_name = name.split('::')[0..-2].join('::')
22
+ namespace_name.empty? ? Object : namespace_name.constantize
23
+ end
24
+
25
+ # Gets the "dirname" of a "module path" (the string/symbol representing the namespace modules that it is contained in),
26
+ # in the same sense that <tt>File.dirname</tt> returns the dirname of a _filesystem_ path.
27
+ #
28
+ # Same as +namespace_of+, only this just returns the _name_ of the namespace module (as a string), rather than returning the
29
+ # constant itself.
30
+ #
31
+ # See also <tt>Module.basename</tt>
32
+ def self.dirname(module_or_name)
33
+ case module_or_name
34
+ when Module
35
+ module_or_name.namespace_module.name
36
+ when Symbol
37
+ Module.split_name(module_or_name)[0..-2].join('::')
38
+ when String
39
+ Module.split_name(module_or_name)[0..-2].join('::')
40
+ end
41
+ end
42
+ class << self
43
+ alias_method :namespace_name_of, :dirname
44
+ end
45
+
46
+ def self.namespace_of(module_or_name)
47
+ namespace_name_of(module_or_name).constantize
48
+ end
49
+ end
50
+
51
+
52
+
53
+
54
+ # _____ _
55
+ # |_ _|__ ___| |_
56
+ # | |/ _ \/ __| __|
57
+ # | | __/\__ \ |_
58
+ # |_|\___||___/\__|
59
+ #
60
+ =begin test
61
+ require 'test/unit'
62
+
63
+ module OuterModule; end
64
+ module OuterModule::MiddleModule; end
65
+ module OuterModule::MiddleModule::InnerModule; end
66
+
67
+ class NamespaceTest < Test::Unit::TestCase
68
+ module InnerModule; end
69
+ def test_1
70
+ assert_equal Object, OuterModule.namespace_module
71
+ end
72
+ def test_nesting
73
+ assert_equal OuterModule::MiddleModule,
74
+ OuterModule::MiddleModule::InnerModule.namespace_module
75
+ end
76
+ def test_nesting_2
77
+ assert_equal NamespaceTest, InnerModule.namespace_module
78
+ end
79
+ end
80
+
81
+ class NamespaceOfTest < Test::Unit::TestCase
82
+ module InnerModule; end
83
+ def test_1
84
+ assert_equal Object, Module.namespace_of(OuterModule)
85
+ end
86
+ def test_nesting
87
+ assert_equal OuterModule::MiddleModule,
88
+ Module.namespace_of(OuterModule::MiddleModule::InnerModule)
89
+ assert_equal OuterModule::MiddleModule,
90
+ Module.namespace_of(:'OuterModule::MiddleModule::InnerModule')
91
+ assert_equal OuterModule::MiddleModule,
92
+ Module.namespace_of('OuterModule::MiddleModule::InnerModule')
93
+ end
94
+ end
95
+
96
+ class NamespaceNameOfTest < Test::Unit::TestCase
97
+ module InnerModule; end
98
+ def test_1
99
+ assert_equal 'Object',
100
+ Module.namespace_name_of(OuterModule)
101
+ end
102
+ def test_nesting
103
+ assert_equal 'OuterModule::MiddleModule',
104
+ Module.namespace_name_of(OuterModule::MiddleModule::InnerModule)
105
+ assert_equal 'OuterModule::MiddleModule',
106
+ Module.namespace_name_of(:'OuterModule::MiddleModule::InnerModule')
107
+ assert_equal 'OuterModule::MiddleModule',
108
+ Module.namespace_name_of('OuterModule::MiddleModule::InnerModule')
109
+ end
110
+ end
111
+ =end
112
+
@@ -0,0 +1,61 @@
1
+ #--
2
+ # Author:: Tyler Rick
3
+ # Copyright:: Copyright (c) ActiveSupport authors
4
+ # License::
5
+ # Submit to Facets?:: Yes.
6
+ # Developer notes::
7
+ # * Tests incomplete...
8
+ # Changes::
9
+ # * Copied from ActiveSupport.
10
+ #++
11
+
12
+
13
+ require 'rubygems'
14
+ require 'facets/core/kernel/constant'
15
+
16
+
17
+ class Module
18
+ # Return all the parents of this module, ordered from nested outwards. The
19
+ # receiver is not contained within the result.
20
+ def parents
21
+ parents = []
22
+ parts = name.split('::')[0..-2]
23
+ until parts.empty?
24
+ #parents << (parts * '::').constantize
25
+ parents << constant(parts * '::')
26
+ parts.pop
27
+ end
28
+ parents << Object unless parents.include? Object
29
+ parents
30
+ end
31
+ end
32
+
33
+
34
+
35
+
36
+ # _____ _
37
+ # |_ _|__ ___| |_
38
+ # | |/ _ \/ __| __|
39
+ # | | __/\__ \ |_
40
+ # |_|\___||___/\__|
41
+ #
42
+ =begin test
43
+ require 'test/unit'
44
+
45
+ module OuterModule; end
46
+ module OuterModule::InnerModule; end
47
+
48
+ class TheTest < Test::Unit::TestCase
49
+ module InnerModule; end
50
+ def test_1
51
+ assert_equal [Object], OuterModule.parents
52
+ end
53
+ def test_nesting
54
+ assert_equal [OuterModule, Object], OuterModule::InnerModule.parents
55
+ end
56
+ def test_nesting_2
57
+ assert_equal [TheTest, Object], InnerModule.parents
58
+ end
59
+ end
60
+ =end
61
+
@@ -0,0 +1,117 @@
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
+ #++
8
+
9
+ require 'rubygems'
10
+ require 'qualitysmith_extensions/object/ignore_access'
11
+ require 'qualitysmith_extensions/module/split'
12
+ require 'facets/core/module/by_name'
13
+ require 'facets/core/module/modspace'
14
+
15
+ module Kernel
16
+ # This is similar to +Kernel#remove_const+, but it _only_ works for modules/classes.
17
+ #
18
+ # This is similar to the built-in <tt>Module#remove_module</tt>, but it lets you do it in a more object oriented manner,
19
+ # calling +remove!+ on the module/class/constant itself that you want to remove, rather than on its parent.
20
+ #
21
+ # Makes it possible to write simply:
22
+ # A::B::C.remove_const!
23
+ # rather than having to think about which module the constant is actually defined in and calling +remove_const+ on that module.
24
+ # This is how you would have to otherwise do it:
25
+ # A::B.send(:remove_const, :C)
26
+ #
27
+ def remove_const!
28
+ if split.size > 1
29
+ parent_module = modspace # For example, would be A::B for A::B::C
30
+ const_to_remove = split.last # For example, would be :C for A::B::C
31
+ parent_module.ignore_access.remove_const(const_to_remove)
32
+ else
33
+ Object.ignore_access.remove_const(name)
34
+ end
35
+ end
36
+ end
37
+
38
+ # _____ _
39
+ # |_ _|__ ___| |_
40
+ # | |/ _ \/ __| __|
41
+ # | | __/\__ \ |_
42
+ # |_|\___||___/\__|
43
+ #
44
+ =begin test
45
+ require 'test/unit'
46
+ require 'qualitysmith_extensions/kernel/remove_const' # Test for compatibility. Just in case the remove_const_before_was_added_to_Kernel alias might have thrown something off.
47
+
48
+ # How it would be done *without* this extension:
49
+ module TestRemoveABC_TheOldWay
50
+ module A
51
+ module B
52
+ class C
53
+ end
54
+ end
55
+ end
56
+
57
+ class TheTest < Test::Unit::TestCase
58
+ def test_1
59
+ assert_nothing_raised { A::B::C }
60
+ A::B.send(:remove_const, :C)
61
+ assert_raise(NameError) { A::B::C }
62
+ end
63
+ end
64
+ end
65
+
66
+ # How it would be done *with* this extension:
67
+ module TestRemoveABC
68
+ module A
69
+ module B
70
+ class C
71
+ end
72
+ end
73
+ end
74
+
75
+ class TheTest < Test::Unit::TestCase
76
+ def test_1
77
+ assert_nothing_raised { A::B::C }
78
+ A::B::C.remove_const!
79
+ assert_raise(NameError) { A::B::C }
80
+ end
81
+ end
82
+ end
83
+
84
+ module TestRemoveAB
85
+ module A
86
+ module B
87
+ module C
88
+ end
89
+ end
90
+ end
91
+
92
+ class TheTest < Test::Unit::TestCase
93
+ def test_1
94
+ assert_nothing_raised { A::B }
95
+ A::B.remove_const!
96
+ assert_raise(NameError) { A::B }
97
+ end
98
+ end
99
+ end
100
+
101
+ module A
102
+ end
103
+ module TestRemoveA_FromObject
104
+
105
+ class TheTest < Test::Unit::TestCase
106
+ def test_1
107
+ assert_nothing_raised { A }
108
+ A.remove_const!
109
+ assert_raise(NameError) { A }
110
+ end
111
+ end
112
+ end
113
+
114
+ =end
115
+
116
+
117
+