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