sigterm_extensions 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (116) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +17 -0
  3. data/Gemfile +6 -0
  4. data/LICENSE.md +0 -0
  5. data/README.md +0 -0
  6. data/bin/ctxirb +156 -0
  7. data/lib/git.rb +166 -0
  8. data/lib/git/LICENSE +21 -0
  9. data/lib/git/author.rb +14 -0
  10. data/lib/git/base.rb +551 -0
  11. data/lib/git/base/factory.rb +75 -0
  12. data/lib/git/branch.rb +126 -0
  13. data/lib/git/branches.rb +71 -0
  14. data/lib/git/config.rb +22 -0
  15. data/lib/git/diff.rb +159 -0
  16. data/lib/git/index.rb +5 -0
  17. data/lib/git/lib.rb +1041 -0
  18. data/lib/git/log.rb +128 -0
  19. data/lib/git/object.rb +312 -0
  20. data/lib/git/path.rb +31 -0
  21. data/lib/git/remote.rb +36 -0
  22. data/lib/git/repository.rb +6 -0
  23. data/lib/git/stash.rb +27 -0
  24. data/lib/git/stashes.rb +55 -0
  25. data/lib/git/status.rb +199 -0
  26. data/lib/git/version.rb +5 -0
  27. data/lib/git/working_directory.rb +4 -0
  28. data/lib/sigterm_extensions.rb +75 -0
  29. data/lib/sigterm_extensions/all.rb +12 -0
  30. data/lib/sigterm_extensions/backtrace_cleaner.rb +129 -0
  31. data/lib/sigterm_extensions/callbacks.rb +847 -0
  32. data/lib/sigterm_extensions/concern.rb +169 -0
  33. data/lib/sigterm_extensions/configurable.rb +38 -0
  34. data/lib/sigterm_extensions/core_ext.rb +4 -0
  35. data/lib/sigterm_extensions/core_ext/array.rb +3 -0
  36. data/lib/sigterm_extensions/core_ext/array/extract.rb +19 -0
  37. data/lib/sigterm_extensions/core_ext/array/extract_options.rb +29 -0
  38. data/lib/sigterm_extensions/core_ext/class.rb +3 -0
  39. data/lib/sigterm_extensions/core_ext/class/attribute.rb +139 -0
  40. data/lib/sigterm_extensions/core_ext/class/attribute_accessors.rb +4 -0
  41. data/lib/sigterm_extensions/core_ext/class/subclasses.rb +52 -0
  42. data/lib/sigterm_extensions/core_ext/custom.rb +12 -0
  43. data/lib/sigterm_extensions/core_ext/digest.rb +3 -0
  44. data/lib/sigterm_extensions/core_ext/digest/uuid.rb +51 -0
  45. data/lib/sigterm_extensions/core_ext/enumerable.rb +232 -0
  46. data/lib/sigterm_extensions/core_ext/file.rb +3 -0
  47. data/lib/sigterm_extensions/core_ext/file/atomic.rb +68 -0
  48. data/lib/sigterm_extensions/core_ext/hash.rb +3 -0
  49. data/lib/sigterm_extensions/core_ext/hash/deep_merge.rb +41 -0
  50. data/lib/sigterm_extensions/core_ext/hash/deep_transform_values.rb +44 -0
  51. data/lib/sigterm_extensions/core_ext/hash/except.rb +22 -0
  52. data/lib/sigterm_extensions/core_ext/hash/keys.rb +141 -0
  53. data/lib/sigterm_extensions/core_ext/hash/reverse_merge.rb +23 -0
  54. data/lib/sigterm_extensions/core_ext/hash/slice.rb +24 -0
  55. data/lib/sigterm_extensions/core_ext/kernel.rb +3 -0
  56. data/lib/sigterm_extensions/core_ext/kernel/concern.rb +12 -0
  57. data/lib/sigterm_extensions/core_ext/kernel/reporting.rb +43 -0
  58. data/lib/sigterm_extensions/core_ext/kernel/singleton_class.rb +6 -0
  59. data/lib/sigterm_extensions/core_ext/load_error.rb +7 -0
  60. data/lib/sigterm_extensions/core_ext/module.rb +3 -0
  61. data/lib/sigterm_extensions/core_ext/module/aliasing.rb +29 -0
  62. data/lib/sigterm_extensions/core_ext/module/anonymous.rb +28 -0
  63. data/lib/sigterm_extensions/core_ext/module/attr_internal.rb +36 -0
  64. data/lib/sigterm_extensions/core_ext/module/attribute_accessors.rb +208 -0
  65. data/lib/sigterm_extensions/core_ext/module/attribute_accessors_per_thread.rb +146 -0
  66. data/lib/sigterm_extensions/core_ext/module/concerning.rb +132 -0
  67. data/lib/sigterm_extensions/core_ext/module/delegation.rb +319 -0
  68. data/lib/sigterm_extensions/core_ext/module/redefine_method.rb +38 -0
  69. data/lib/sigterm_extensions/core_ext/module/remove_method.rb +15 -0
  70. data/lib/sigterm_extensions/core_ext/name_error.rb +36 -0
  71. data/lib/sigterm_extensions/core_ext/object.rb +3 -0
  72. data/lib/sigterm_extensions/core_ext/object/blank.rb +153 -0
  73. data/lib/sigterm_extensions/core_ext/object/colors.rb +39 -0
  74. data/lib/sigterm_extensions/core_ext/object/duplicable.rb +47 -0
  75. data/lib/sigterm_extensions/core_ext/object/inclusion.rb +27 -0
  76. data/lib/sigterm_extensions/core_ext/object/instance_variables.rb +28 -0
  77. data/lib/sigterm_extensions/core_ext/object/methods.rb +61 -0
  78. data/lib/sigterm_extensions/core_ext/object/with_options.rb +80 -0
  79. data/lib/sigterm_extensions/core_ext/range.rb +3 -0
  80. data/lib/sigterm_extensions/core_ext/range/compare_range.rb +74 -0
  81. data/lib/sigterm_extensions/core_ext/range/conversions.rb +39 -0
  82. data/lib/sigterm_extensions/core_ext/range/overlaps.rb +8 -0
  83. data/lib/sigterm_extensions/core_ext/securerandom.rb +43 -0
  84. data/lib/sigterm_extensions/core_ext/string.rb +3 -0
  85. data/lib/sigterm_extensions/core_ext/string/access.rb +93 -0
  86. data/lib/sigterm_extensions/core_ext/string/filters.rb +143 -0
  87. data/lib/sigterm_extensions/core_ext/string/starts_ends_with.rb +4 -0
  88. data/lib/sigterm_extensions/core_ext/string/strip.rb +25 -0
  89. data/lib/sigterm_extensions/core_ext/tryable.rb +132 -0
  90. data/lib/sigterm_extensions/descendants_tracker.rb +108 -0
  91. data/lib/sigterm_extensions/gem_methods.rb +47 -0
  92. data/lib/sigterm_extensions/hash_binding.rb +16 -0
  93. data/lib/sigterm_extensions/inflector.rb +339 -0
  94. data/lib/sigterm_extensions/inflector/acronyms.rb +42 -0
  95. data/lib/sigterm_extensions/inflector/inflections.rb +249 -0
  96. data/lib/sigterm_extensions/inflector/inflections/defaults.rb +117 -0
  97. data/lib/sigterm_extensions/inflector/rules.rb +37 -0
  98. data/lib/sigterm_extensions/inflector/version.rb +8 -0
  99. data/lib/sigterm_extensions/interactive_editor.rb +120 -0
  100. data/lib/sigterm_extensions/lazy.rb +34 -0
  101. data/lib/sigterm_extensions/lazy_load_hooks.rb +79 -0
  102. data/lib/sigterm_extensions/option_merger.rb +32 -0
  103. data/lib/sigterm_extensions/ordered_hash.rb +48 -0
  104. data/lib/sigterm_extensions/ordered_options.rb +83 -0
  105. data/lib/sigterm_extensions/paths.rb +235 -0
  106. data/lib/sigterm_extensions/per_thread_registry.rb +58 -0
  107. data/lib/sigterm_extensions/proxy_object.rb +14 -0
  108. data/lib/sigterm_extensions/staging/boot.rb +31 -0
  109. data/lib/sigterm_extensions/staging/boot/bundler_patch.rb +24 -0
  110. data/lib/sigterm_extensions/staging/boot/command.rb +26 -0
  111. data/lib/sigterm_extensions/staging/boot/gemfile_next_auto_sync.rb +79 -0
  112. data/lib/sigterm_extensions/version.rb +4 -0
  113. data/lib/sigterm_extensions/wrappable.rb +16 -0
  114. data/sigterm_extensions.gemspec +42 -0
  115. data/templates/dotpryrc.rb.erb +124 -0
  116. metadata +315 -0
@@ -0,0 +1,38 @@
1
+ class Module
2
+ # Marks the named method as intended to be redefined, if it exists.
3
+ # Suppresses the Ruby method redefinition warning. Prefer
4
+ # #redefine_method where possible.
5
+ def silence_redefinition_of_method(method)
6
+ if method_defined?(method) || private_method_defined?(method)
7
+ # This suppresses the "method redefined" warning; the self-alias
8
+ # looks odd, but means we don't need to generate a unique name
9
+ alias_method method, method
10
+ end
11
+ end
12
+
13
+ # Replaces the existing method definition, if there is one, with the passed
14
+ # block as its body.
15
+ def redefine_method(method, &block)
16
+ visibility = method_visibility(method)
17
+ silence_redefinition_of_method(method)
18
+ define_method(method, &block)
19
+ send(visibility, method)
20
+ end
21
+
22
+ # Replaces the existing singleton method definition, if there is one, with
23
+ # the passed block as its body.
24
+ def redefine_singleton_method(method, &block)
25
+ singleton_class.redefine_method(method, &block)
26
+ end
27
+
28
+ def method_visibility(method) # :nodoc:
29
+ case
30
+ when private_method_defined?(method)
31
+ :private
32
+ when protected_method_defined?(method)
33
+ :protected
34
+ else
35
+ :public
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,15 @@
1
+ require "sigterm_extensions/core_ext/module/redefine_method"
2
+
3
+ class Module
4
+ # Removes the named method, if it exists.
5
+ def remove_possible_method(method)
6
+ if method_defined?(method) || private_method_defined?(method)
7
+ undef_method(method)
8
+ end
9
+ end
10
+
11
+ # Removes the named singleton method, if it exists.
12
+ def remove_possible_singleton_method(method)
13
+ singleton_class.remove_possible_method(method)
14
+ end
15
+ end
@@ -0,0 +1,36 @@
1
+ class NameError
2
+ # Extract the name of the missing constant from the exception message.
3
+ #
4
+ # begin
5
+ # HelloWorld
6
+ # rescue NameError => e
7
+ # e.missing_name
8
+ # end
9
+ # # => "HelloWorld"
10
+ def missing_name
11
+ # Since ruby v2.3.0 `did_you_mean` gem is loaded by default.
12
+ # It extends NameError#message with spell corrections which are SLOW.
13
+ # We should use original_message message instead.
14
+ message = respond_to?(:original_message) ? original_message : self.message
15
+
16
+ unless /undefined local variable or method/.match?(message)
17
+ $1 if /((::)?([A-Z]\w*)(::[A-Z]\w*)*)$/ =~ message
18
+ end
19
+ end
20
+
21
+ # Was this exception raised because the given name was missing?
22
+ #
23
+ # begin
24
+ # HelloWorld
25
+ # rescue NameError => e
26
+ # e.missing_name?("HelloWorld")
27
+ # end
28
+ # # => true
29
+ def missing_name?(name)
30
+ if name.is_a? Symbol
31
+ self.name == name
32
+ else
33
+ missing_name == name.to_s
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,3 @@
1
+ Dir.glob(File.expand_path('object/*.rb', __dir__)).each do |path|
2
+ require path
3
+ end
@@ -0,0 +1,153 @@
1
+ require "concurrent/map"
2
+
3
+ class Object
4
+ # An object is blank if it's false, empty, or a whitespace string.
5
+ # For example, +nil+, '', ' ', [], {}, and +false+ are all blank.
6
+ #
7
+ # This simplifies
8
+ #
9
+ # !address || address.empty?
10
+ #
11
+ # to
12
+ #
13
+ # address.blank?
14
+ #
15
+ # @return [true, false]
16
+ def blank?
17
+ respond_to?(:empty?) ? !!empty? : !self
18
+ end
19
+
20
+ # An object is present if it's not blank.
21
+ #
22
+ # @return [true, false]
23
+ def present?
24
+ !blank?
25
+ end
26
+
27
+ # Returns the receiver if it's present otherwise returns +nil+.
28
+ # <tt>object.presence</tt> is equivalent to
29
+ #
30
+ # object.present? ? object : nil
31
+ #
32
+ # For example, something like
33
+ #
34
+ # state = params[:state] if params[:state].present?
35
+ # country = params[:country] if params[:country].present?
36
+ # region = state || country || 'US'
37
+ #
38
+ # becomes
39
+ #
40
+ # region = params[:state].presence || params[:country].presence || 'US'
41
+ #
42
+ # @return [Object]
43
+ def presence
44
+ self if present?
45
+ end
46
+ end
47
+
48
+ class NilClass
49
+ # +nil+ is blank:
50
+ #
51
+ # nil.blank? # => true
52
+ #
53
+ # @return [true]
54
+ def blank?
55
+ true
56
+ end
57
+ end
58
+
59
+ class FalseClass
60
+ # +false+ is blank:
61
+ #
62
+ # false.blank? # => true
63
+ #
64
+ # @return [true]
65
+ def blank?
66
+ true
67
+ end
68
+ end
69
+
70
+ class TrueClass
71
+ # +true+ is not blank:
72
+ #
73
+ # true.blank? # => false
74
+ #
75
+ # @return [false]
76
+ def blank?
77
+ false
78
+ end
79
+ end
80
+
81
+ class Array
82
+ # An array is blank if it's empty:
83
+ #
84
+ # [].blank? # => true
85
+ # [1,2,3].blank? # => false
86
+ #
87
+ # @return [true, false]
88
+ alias_method :blank?, :empty?
89
+ end
90
+
91
+ class Hash
92
+ # A hash is blank if it's empty:
93
+ #
94
+ # {}.blank? # => true
95
+ # { key: 'value' }.blank? # => false
96
+ #
97
+ # @return [true, false]
98
+ alias_method :blank?, :empty?
99
+ end
100
+
101
+ class String
102
+ BLANK_RE = /\A[[:space:]]*\z/
103
+ ENCODED_BLANKS = Concurrent::Map.new do |h, enc|
104
+ h[enc] = Regexp.new(BLANK_RE.source.encode(enc), BLANK_RE.options | Regexp::FIXEDENCODING)
105
+ end
106
+
107
+ # A string is blank if it's empty or contains whitespaces only:
108
+ #
109
+ # ''.blank? # => true
110
+ # ' '.blank? # => true
111
+ # "\t\n\r".blank? # => true
112
+ # ' blah '.blank? # => false
113
+ #
114
+ # Unicode whitespace is supported:
115
+ #
116
+ # "\u00a0".blank? # => true
117
+ #
118
+ # @return [true, false]
119
+ def blank?
120
+ # The regexp that matches blank strings is expensive. For the case of empty
121
+ # strings we can speed up this method (~3.5x) with an empty? call. The
122
+ # penalty for the rest of strings is marginal.
123
+ empty? ||
124
+ begin
125
+ BLANK_RE.match?(self)
126
+ rescue Encoding::CompatibilityError
127
+ ENCODED_BLANKS[self.encoding].match?(self)
128
+ end
129
+ end
130
+ end
131
+
132
+ class Numeric #:nodoc:
133
+ # No number is blank:
134
+ #
135
+ # 1.blank? # => false
136
+ # 0.blank? # => false
137
+ #
138
+ # @return [false]
139
+ def blank?
140
+ false
141
+ end
142
+ end
143
+
144
+ class Time #:nodoc:
145
+ # No Time is blank:
146
+ #
147
+ # Time.now.blank? # => false
148
+ #
149
+ # @return [false]
150
+ def blank?
151
+ false
152
+ end
153
+ end
@@ -0,0 +1,39 @@
1
+ # Method to pretty-print object methods
2
+ # Coded by sebastian delmont
3
+ # http://snippets.dzone.com/posts/show/2916
4
+ #class Object
5
+ # ANSI_BOLD = "\033[1m"
6
+ # ANSI_RESET = "\033[0m"
7
+ # ANSI_LGRAY = "\033[0;37m"
8
+ # ANSI_GRAY = "\033[1;30m"
9
+ # # Print object's methods
10
+ # def pm(*options)
11
+ # methods = self.methods
12
+ # methods -= Object.methods unless options.include? :more
13
+ # filter = options.select {|opt| opt.kind_of? Regexp}.first
14
+ # methods = methods.select {|name| name =~ filter} if filter
15
+ #
16
+ # data = methods.sort.collect do |name|
17
+ # method = self.method(name)
18
+ # if method.arity == 0
19
+ # args = "()"
20
+ # elsif method.arity > 0
21
+ # n = method.arity
22
+ # args = "(#{(1..n).collect {|i| "arg#{i}"}.join(", ")})"
23
+ # elsif method.arity < 0
24
+ # n = -method.arity
25
+ # args = "(#{(1..n).collect {|i| "arg#{i}"}.join(", ")}, ...)"
26
+ # end
27
+ # klass = $1 if method.inspect =~ /Method: (.*?)#/
28
+ # [name, args, klass]
29
+ # end
30
+ # max_name = data.collect {|item| item[0].size}.max
31
+ # max_args = data.collect {|item| item[1].size}.max
32
+ # data.each do |item|
33
+ # print " #{ANSI_BOLD}#{item[0].to_s.rjust(max_name)}#{ANSI_RESET}"
34
+ # print "#{ANSI_GRAY}#{item[1].ljust(max_args)}#{ANSI_RESET}"
35
+ # print " #{ANSI_LGRAY}#{item[2]}#{ANSI_RESET}\n"
36
+ # end
37
+ # data.size
38
+ # end
39
+ #end
@@ -0,0 +1,47 @@
1
+ #--
2
+ # Most objects are cloneable, but not all. For example you can't dup methods:
3
+ #
4
+ # method(:puts).dup # => TypeError: allocator undefined for Method
5
+ #
6
+ # Classes may signal their instances are not duplicable removing +dup+/+clone+
7
+ # or raising exceptions from them. So, to dup an arbitrary object you normally
8
+ # use an optimistic approach and are ready to catch an exception, say:
9
+ #
10
+ # arbitrary_object.dup rescue object
11
+ #
12
+ # Rails dups objects in a few critical spots where they are not that arbitrary.
13
+ # That rescue is very expensive (like 40 times slower than a predicate), and it
14
+ # is often triggered.
15
+ #
16
+ # That's why we hardcode the following cases and check duplicable? instead of
17
+ # using that rescue idiom.
18
+ #++
19
+ class Object
20
+ # Can you safely dup this object?
21
+ #
22
+ # False for method objects;
23
+ # true otherwise.
24
+ def duplicable?
25
+ true
26
+ end
27
+ end
28
+
29
+ class Method
30
+ # Methods are not duplicable:
31
+ #
32
+ # method(:puts).duplicable? # => false
33
+ # method(:puts).dup # => TypeError: allocator undefined for Method
34
+ def duplicable?
35
+ false
36
+ end
37
+ end
38
+
39
+ class UnboundMethod
40
+ # Unbound methods are not duplicable:
41
+ #
42
+ # method(:puts).unbind.duplicable? # => false
43
+ # method(:puts).unbind.dup # => TypeError: allocator undefined for UnboundMethod
44
+ def duplicable?
45
+ false
46
+ end
47
+ end
@@ -0,0 +1,27 @@
1
+ class Object
2
+ # Returns true if this object is included in the argument. Argument must be
3
+ # any object which responds to +#include?+. Usage:
4
+ #
5
+ # characters = ["Konata", "Kagami", "Tsukasa"]
6
+ # "Konata".in?(characters) # => true
7
+ #
8
+ # This will throw an +ArgumentError+ if the argument doesn't respond
9
+ # to +#include?+.
10
+ def in?(another_object)
11
+ another_object.include?(self)
12
+ rescue NoMethodError
13
+ raise ArgumentError.new("The parameter passed to #in? must respond to #include?")
14
+ end
15
+
16
+ # Returns the receiver if it's included in the argument otherwise returns +nil+.
17
+ # Argument must be any object which responds to +#include?+. Usage:
18
+ #
19
+ # params[:bucket_type].presence_in %w( project calendar )
20
+ #
21
+ # This will throw an +ArgumentError+ if the argument doesn't respond to +#include?+.
22
+ #
23
+ # @return [Object]
24
+ def presence_in(another_object)
25
+ in?(another_object) ? self : nil
26
+ end
27
+ end
@@ -0,0 +1,28 @@
1
+ class Object
2
+ # Returns a hash with string keys that maps instance variable names without "@" to their
3
+ # corresponding values.
4
+ #
5
+ # class C
6
+ # def initialize(x, y)
7
+ # @x, @y = x, y
8
+ # end
9
+ # end
10
+ #
11
+ # C.new(0, 1).instance_values # => {"x" => 0, "y" => 1}
12
+ def instance_values
13
+ Hash[instance_variables.map { |name| [name[1..-1], instance_variable_get(name)] }]
14
+ end
15
+
16
+ # Returns an array of instance variable names as strings including "@".
17
+ #
18
+ # class C
19
+ # def initialize(x, y)
20
+ # @x, @y = x, y
21
+ # end
22
+ # end
23
+ #
24
+ # C.new(0, 1).instance_variable_names # => ["@y", "@x"]
25
+ def instance_variable_names
26
+ instance_variables.map(&:to_s)
27
+ end
28
+ end
@@ -0,0 +1,61 @@
1
+ class Object
2
+ # Returns true if this object is included in the argument. Argument must be
3
+ # any object which responds to +#include?+. Usage:
4
+ #
5
+ # characters = ["Konata", "Kagami", "Tsukasa"]
6
+ # "Konata".in?(characters) # => true
7
+ #
8
+ # This will throw an +ArgumentError+ if the argument doesn't respond
9
+ # to +#include?+.
10
+ def in?(another_object)
11
+ another_object.include?(self)
12
+ rescue NoMethodError
13
+ raise ArgumentError.new("The parameter passed to #in? must respond to #include?")
14
+ end
15
+
16
+ # Returns the receiver if it's included in the argument otherwise returns +nil+.
17
+ # Argument must be any object which responds to +#include?+. Usage:
18
+ #
19
+ # params[:bucket_type].presence_in %w( project calendar )
20
+ #
21
+ # This will throw an +ArgumentError+ if the argument doesn't respond to +#include?+.
22
+ #
23
+ # @return [Object]
24
+ def presence_in(another_object)
25
+ in?(another_object) ? self : nil
26
+ end
27
+
28
+ # list methods which aren't in superclass
29
+ def local_methods(obj = self)
30
+ (obj.methods - obj.class.superclass.instance_methods).sort
31
+ end
32
+
33
+ def my_methods
34
+ base_object = case self
35
+ when Class then Class.new
36
+ when Module then Module.new
37
+ else Object.new
38
+ end
39
+ (methods - base_object.methods).sort
40
+ end
41
+
42
+ # print documentation
43
+ #
44
+ # ri 'Array#pop'
45
+ # Array.ri
46
+ # Array.ri :pop
47
+ # arr.ri :pop
48
+ def ri(method = nil)
49
+ unless method && method =~ /^[A-Z]/ # if class isn't specified
50
+ klass = self.kind_of?(Class) ? name : self.class.name
51
+ method = [klass, method].compact.join('#')
52
+ end
53
+ puts `ri '#{method}'`
54
+ end
55
+
56
+ # Return only the methods not present on basic objects
57
+ def interesting_methods
58
+ (self.methods - Object.new.methods).sort
59
+ end
60
+
61
+ end