sigterm_extensions 0.0.4

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 (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,36 @@
1
+ module Git
2
+ class Remote < Path
3
+
4
+ attr_accessor :name, :url, :fetch_opts
5
+
6
+ def initialize(base, name)
7
+ @base = base
8
+ config = @base.lib.config_remote(name)
9
+ @name = name
10
+ @url = config['url']
11
+ @fetch_opts = config['fetch']
12
+ end
13
+
14
+ def fetch(opts={})
15
+ @base.fetch(@name, opts)
16
+ end
17
+
18
+ # merge this remote locally
19
+ def merge(branch = 'master')
20
+ @base.merge("#{@name}/#{branch}")
21
+ end
22
+
23
+ def branch(branch = 'master')
24
+ Git::Branch.new(@base, "#{@name}/#{branch}")
25
+ end
26
+
27
+ def remove
28
+ @base.lib.remote_remove(@name)
29
+ end
30
+
31
+ def to_s
32
+ @name
33
+ end
34
+
35
+ end
36
+ end
@@ -0,0 +1,6 @@
1
+ module Git
2
+
3
+ class Repository < Path
4
+ end
5
+
6
+ end
@@ -0,0 +1,27 @@
1
+ module Git
2
+ class Stash
3
+
4
+ def initialize(base, message, existing=false)
5
+ @base = base
6
+ @message = message
7
+ save unless existing
8
+ end
9
+
10
+ def save
11
+ @saved = @base.lib.stash_save(@message)
12
+ end
13
+
14
+ def saved?
15
+ @saved
16
+ end
17
+
18
+ def message
19
+ @message
20
+ end
21
+
22
+ def to_s
23
+ message
24
+ end
25
+
26
+ end
27
+ end
@@ -0,0 +1,55 @@
1
+ module Git
2
+
3
+ # object that holds all the available stashes
4
+ class Stashes
5
+ include Enumerable
6
+
7
+ def initialize(base)
8
+ @stashes = []
9
+
10
+ @base = base
11
+
12
+ @base.lib.stashes_all.each do |id, message|
13
+ @stashes.unshift(Git::Stash.new(@base, message, true))
14
+ end
15
+ end
16
+
17
+ #
18
+ # Returns an multi-dimensional Array of elements that have been stash saved.
19
+ # Array is based on position and name. See Example
20
+ #
21
+ # @example Returns Array of items that have been stashed
22
+ # .all - [0, "testing-stash-all"]]
23
+ # @return [Array]
24
+ def all
25
+ @base.lib.stashes_all
26
+ end
27
+
28
+ def save(message)
29
+ s = Git::Stash.new(@base, message)
30
+ @stashes.unshift(s) if s.saved?
31
+ end
32
+
33
+ def apply(index=nil)
34
+ @base.lib.stash_apply(index)
35
+ end
36
+
37
+ def clear
38
+ @base.lib.stash_clear
39
+ @stashes = []
40
+ end
41
+
42
+ def size
43
+ @stashes.size
44
+ end
45
+
46
+ def each(&block)
47
+ @stashes.each(&block)
48
+ end
49
+
50
+ def [](index)
51
+ @stashes[index.to_i]
52
+ end
53
+
54
+ end
55
+ end
@@ -0,0 +1,199 @@
1
+ module Git
2
+ #
3
+ # A class for git status
4
+ #
5
+ class Status
6
+ include Enumerable
7
+
8
+ def initialize(base)
9
+ @base = base
10
+ construct_status
11
+ end
12
+
13
+ #
14
+ # Returns an Enumerable containing files that have changed from the
15
+ # git base directory
16
+ #
17
+ # @return [Enumerable]
18
+ def changed
19
+ @files.select { |_k, f| f.type == 'M' }
20
+ end
21
+
22
+ #
23
+ # Determines whether the given file has been changed.
24
+ # File path starts at git base directory
25
+ #
26
+ # @param file [String] The name of the file.
27
+ # @example Check if lib/git.rb has changed.
28
+ # changed?('lib/git.rb')
29
+ # @return [Boolean]
30
+ def changed?(file)
31
+ changed.member?(file)
32
+ end
33
+
34
+ #
35
+ # Returns an Enumerable containing files that have been added.
36
+ # File path starts at git base directory
37
+ #
38
+ # @return [Enumerable]
39
+ def added
40
+ @files.select { |_k, f| f.type == 'A' }
41
+ end
42
+
43
+ #
44
+ # Determines whether the given file has been added to the repository
45
+ # File path starts at git base directory
46
+ #
47
+ # @param file [String] The name of the file.
48
+ # @example Check if lib/git.rb is added.
49
+ # added?('lib/git.rb')
50
+ # @return [Boolean]
51
+ def added?(file)
52
+ added.member?(file)
53
+ end
54
+
55
+ #
56
+ # Returns an Enumerable containing files that have been deleted.
57
+ # File path starts at git base directory
58
+ #
59
+ # @return [Enumerable]
60
+ def deleted
61
+ @files.select { |_k, f| f.type == 'D' }
62
+ end
63
+
64
+ #
65
+ # Determines whether the given file has been deleted from the repository
66
+ # File path starts at git base directory
67
+ #
68
+ # @param file [String] The name of the file.
69
+ # @example Check if lib/git.rb is deleted.
70
+ # deleted?('lib/git.rb')
71
+ # @return [Boolean]
72
+ def deleted?(file)
73
+ deleted.member?(file)
74
+ end
75
+
76
+ #
77
+ # Returns an Enumerable containing files that are not tracked in git.
78
+ # File path starts at git base directory
79
+ #
80
+ # @return [Enumerable]
81
+ def untracked
82
+ @files.select { |_k, f| f.untracked }
83
+ end
84
+
85
+ #
86
+ # Determines whether the given file has is tracked by git.
87
+ # File path starts at git base directory
88
+ #
89
+ # @param file [String] The name of the file.
90
+ # @example Check if lib/git.rb is an untracked file.
91
+ # untracked?('lib/git.rb')
92
+ # @return [Boolean]
93
+ def untracked?(file)
94
+ untracked.member?(file)
95
+ end
96
+
97
+ def pretty
98
+ out = ''
99
+ each do |file|
100
+ out << pretty_file(file)
101
+ end
102
+ out << "\n"
103
+ out
104
+ end
105
+
106
+ def pretty_file(file)
107
+ <<-FILE.strip_heredoc
108
+ #{file.path}
109
+ \tsha(r) #{file.sha_repo} #{file.mode_repo}
110
+ \tsha(i) #{file.sha_index} #{file.mode_index}
111
+ \ttype #{file.type}
112
+ \tstage #{file.stage}
113
+ \tuntrac #{file.untracked}
114
+ FILE
115
+ end
116
+
117
+ # enumerable method
118
+
119
+ def [](file)
120
+ @files[file]
121
+ end
122
+
123
+ def each(&block)
124
+ @files.values.each(&block)
125
+ end
126
+
127
+ # subclass that does heavy lifting
128
+ class StatusFile
129
+ attr_accessor :path, :type, :stage, :untracked
130
+ attr_accessor :mode_index, :mode_repo
131
+ attr_accessor :sha_index, :sha_repo
132
+
133
+ def initialize(base, hash)
134
+ @base = base
135
+ @path = hash[:path]
136
+ @type = hash[:type]
137
+ @stage = hash[:stage]
138
+ @mode_index = hash[:mode_index]
139
+ @mode_repo = hash[:mode_repo]
140
+ @sha_index = hash[:sha_index]
141
+ @sha_repo = hash[:sha_repo]
142
+ @untracked = hash[:untracked]
143
+ end
144
+
145
+ def blob(type = :index)
146
+ if type == :repo
147
+ @base.object(@sha_repo)
148
+ else
149
+ begin
150
+ @base.object(@sha_index)
151
+ rescue
152
+ @base.object(@sha_repo)
153
+ end
154
+ end
155
+ end
156
+ end
157
+
158
+ private
159
+
160
+ def construct_status
161
+ @files = @base.lib.ls_files
162
+
163
+ fetch_untracked
164
+ fetch_modified
165
+ fetch_added
166
+
167
+ @files.each do |k, file_hash|
168
+ @files[k] = StatusFile.new(@base, file_hash)
169
+ end
170
+ end
171
+
172
+ def fetch_untracked
173
+ ignore = @base.lib.ignored_files
174
+
175
+ Dir.chdir(@base.dir.path) do
176
+ Dir.glob('**/*', File::FNM_DOTMATCH) do |file|
177
+ next if @files[file] || File.directory?(file) ||
178
+ ignore.include?(file) || file =~ %r{^.git\/.+}
179
+
180
+ @files[file] = { path: file, untracked: true }
181
+ end
182
+ end
183
+ end
184
+
185
+ def fetch_modified
186
+ # find modified in tree
187
+ @base.lib.diff_files.each do |path, data|
188
+ @files[path] ? @files[path].merge!(data) : @files[path] = data
189
+ end
190
+ end
191
+
192
+ def fetch_added
193
+ # find added but not committed - new files
194
+ @base.lib.diff_index('HEAD').each do |path, data|
195
+ @files[path] ? @files[path].merge!(data) : @files[path] = data
196
+ end
197
+ end
198
+ end
199
+ end
@@ -0,0 +1,5 @@
1
+ module Git
2
+ # The current gem version
3
+ # @return [String] the current gem version.
4
+ VERSION='1.5.0'
5
+ end
@@ -0,0 +1,4 @@
1
+ module Git
2
+ class WorkingDirectory < Git::Path
3
+ end
4
+ end
@@ -0,0 +1,75 @@
1
+ require 'erb'
2
+ require 'yaml'
3
+ require 'ostruct'
4
+ require 'rake'
5
+ require 'awesome_print'
6
+ require 'pry'
7
+ require 'logger'
8
+
9
+ Rake.application.options.trace = true
10
+ ENV['EDITOR'] = 'vim' if ENV['EDITOR'].nil?
11
+ ENV['SHELL'] = '/bin/bash' if ENV['SHELL'].nil?
12
+
13
+ module SigtermExtensions
14
+ def self.root_path(*args)
15
+ File.join File.expand_path('../', __dir__), *args
16
+ end
17
+
18
+ def self.ext_path(*args)
19
+ File.join SigtermExtensions.root_path, 'lib/sigterm_extensions', args
20
+ end
21
+
22
+ def self.revision
23
+ `git log --pretty=format:%h --abbrev=11 -n 1`
24
+ end
25
+
26
+ alias :orig_require :require
27
+ def self.require s
28
+ print "Requires #{s}\n" if orig_require(s)
29
+ end
30
+
31
+ def self.get_classes_from mod
32
+ mod.constants.select { |k| mod.const_get(k).instance_of? Class }
33
+ end
34
+
35
+ autoload :BacktraceCleaner, SigtermExtensions.ext_path('backtrace_cleaner')
36
+ autoload :Callbacks, SigtermExtensions.ext_path('callbacks')
37
+ autoload :Concern, SigtermExtensions.ext_path('concern')
38
+ autoload :Configurable, SigtermExtensions.ext_path('configurable')
39
+ autoload :DescendantsTracker, SigtermExtensions.ext_path('descendants_tracker')
40
+ autoload :GemMethods, SigtermExtensions.ext_path('gem_methods')
41
+ autoload :Git, SigtermExtensions.root_path('lib/git')
42
+ autoload :HashBinding, SigtermExtensions.ext_path('hash_binding')
43
+ autoload :Inflector, SigtermExtensions.ext_path('inflector')
44
+ autoload :Lazy, SigtermExtensions.ext_path('lazy')
45
+ autoload :Paths, SigtermExtensions.ext_path('paths')
46
+ autoload :ProxyObject, SigtermExtensions.ext_path('proxy_object')
47
+ autoload :Wrappable, SigtermExtensions.ext_path('wrappable')
48
+
49
+ def self.all_requirements
50
+ $LOADED_FEATURES.
51
+ select { |feature| feature.include? 'gems' }.
52
+ map { |feature| File.dirname(feature) }.
53
+ map { |feature| feature.split('/').last }.
54
+ uniq.sort
55
+ end
56
+
57
+ def self.all_required_unfiltered
58
+ $LOADED_FEATURES
59
+ end
60
+
61
+ class RuntimeClassBase
62
+ attr_accessor :settings
63
+ end
64
+
65
+ class RuntimeClass
66
+ def self.new(base=RuntimeClassBase, options={}, &block)
67
+ base = Class.new(base)
68
+ base.class_eval(&block) if block_given?
69
+ base
70
+ end
71
+ end
72
+ end
73
+
74
+ require_relative 'sigterm_extensions/all'
75
+
@@ -0,0 +1,12 @@
1
+ require_relative 'core_ext'
2
+ require_relative 'version'
3
+ require_relative 'lazy_load_hooks'
4
+
5
+ lib_dir = File.expand_path('..', __dir__)
6
+ $:.unshift(lib_dir) unless $LOAD_PATH.include?(lib_dir)
7
+
8
+ staging_dir = File.expand_path('staging', __dir__)
9
+ Dir["#{staging_dir}/*.rb"].each do |ext|
10
+ require ext
11
+ end
12
+
@@ -0,0 +1,129 @@
1
+ module SigtermExtensions
2
+ # Backtraces often include many lines that are not relevant for the context
3
+ # under review. This makes it hard to find the signal amongst the backtrace
4
+ # noise, and adds debugging time. With a BacktraceCleaner, filters and
5
+ # silencers are used to remove the noisy lines, so that only the most relevant
6
+ # lines remain.
7
+ #
8
+ # Filters are used to modify lines of data, while silencers are used to remove
9
+ # lines entirely. The typical filter use case is to remove lengthy path
10
+ # information from the start of each line, and view file paths relevant to the
11
+ # app directory instead of the file system root. The typical silencer use case
12
+ # is to exclude the output of a noisy library from the backtrace, so that you
13
+ # can focus on the rest.
14
+ #
15
+ # bc = SigtermExtensions::BacktraceCleaner.new
16
+ # bc.add_filter { |line| line.gsub(Rails.root.to_s, '') } # strip the Rails.root prefix
17
+ # bc.add_silencer { |line| /puma|rubygems/.match?(line) } # skip any lines from puma or rubygems
18
+ # bc.clean(exception.backtrace) # perform the cleanup
19
+ #
20
+ # To reconfigure an existing BacktraceCleaner (like the default one in Rails)
21
+ # and show as much data as possible, you can always call
22
+ # <tt>BacktraceCleaner#remove_silencers!</tt>, which will restore the
23
+ # backtrace to a pristine state. If you need to reconfigure an existing
24
+ # BacktraceCleaner so that it does not filter or modify the paths of any lines
25
+ # of the backtrace, you can call <tt>BacktraceCleaner#remove_filters!</tt>
26
+ # These two methods will give you a completely untouched backtrace.
27
+ #
28
+ # Inspired by the Quiet Backtrace gem by thoughtbot.
29
+ class BacktraceCleaner
30
+ def initialize
31
+ @filters, @silencers = [], []
32
+ add_gem_filter
33
+ add_gem_silencer
34
+ add_stdlib_silencer
35
+ end
36
+
37
+ # Returns the backtrace after all filters and silencers have been run
38
+ # against it. Filters run first, then silencers.
39
+ def clean(backtrace, kind = :silent)
40
+ filtered = filter_backtrace(backtrace)
41
+
42
+ case kind
43
+ when :silent
44
+ silence(filtered)
45
+ when :noise
46
+ noise(filtered)
47
+ else
48
+ filtered
49
+ end
50
+ end
51
+ alias :filter :clean
52
+
53
+ # Adds a filter from the block provided. Each line in the backtrace will be
54
+ # mapped against this filter.
55
+ #
56
+ # # Will turn "/my/rails/root/app/models/person.rb" into "/app/models/person.rb"
57
+ # backtrace_cleaner.add_filter { |line| line.gsub(Rails.root, '') }
58
+ def add_filter(&block)
59
+ @filters << block
60
+ end
61
+
62
+ # Adds a silencer from the block provided. If the silencer returns +true+
63
+ # for a given line, it will be excluded from the clean backtrace.
64
+ #
65
+ # # Will reject all lines that include the word "puma", like "/gems/puma/server.rb" or "/app/my_puma_server/rb"
66
+ # backtrace_cleaner.add_silencer { |line| /puma/.match?(line) }
67
+ def add_silencer(&block)
68
+ @silencers << block
69
+ end
70
+
71
+ # Removes all silencers, but leaves in the filters. Useful if your
72
+ # context of debugging suddenly expands as you suspect a bug in one of
73
+ # the libraries you use.
74
+ def remove_silencers!
75
+ @silencers = []
76
+ end
77
+
78
+ # Removes all filters, but leaves in the silencers. Useful if you suddenly
79
+ # need to see entire filepaths in the backtrace that you had already
80
+ # filtered out.
81
+ def remove_filters!
82
+ @filters = []
83
+ end
84
+
85
+ private
86
+ FORMATTED_GEMS_PATTERN = /\A[^\/]+ \([\w.]+\) /
87
+
88
+ def add_gem_filter
89
+ gems_paths = (Gem.path | [Gem.default_dir]).map { |p| Regexp.escape(p) }
90
+ return if gems_paths.empty?
91
+
92
+ gems_regexp = %r{(#{gems_paths.join('|')})/(bundler/)?gems/([^/]+)-([\w.]+)/(.*)}
93
+ gems_result = '\3 (\4) \5'
94
+ add_filter { |line| line.sub(gems_regexp, gems_result) }
95
+ end
96
+
97
+ def add_gem_silencer
98
+ add_silencer { |line| FORMATTED_GEMS_PATTERN.match?(line) }
99
+ end
100
+
101
+ def add_stdlib_silencer
102
+ add_silencer { |line| line.start_with?(RbConfig::CONFIG["rubylibdir"]) }
103
+ end
104
+
105
+ def filter_backtrace(backtrace)
106
+ @filters.each do |f|
107
+ backtrace = backtrace.map { |line| f.call(line) }
108
+ end
109
+
110
+ backtrace
111
+ end
112
+
113
+ def silence(backtrace)
114
+ @silencers.each do |s|
115
+ backtrace = backtrace.reject { |line| s.call(line) }
116
+ end
117
+
118
+ backtrace
119
+ end
120
+
121
+ def noise(backtrace)
122
+ backtrace.select do |line|
123
+ @silencers.any? do |s|
124
+ s.call(line)
125
+ end
126
+ end
127
+ end
128
+ end
129
+ end