deprecation_collector 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +6 -0
- data/Gemfile.lock +11 -2
- data/README.md +10 -0
- data/Rakefile +14 -0
- data/deprecation_collector.gemspec +3 -2
- data/lib/deprecation_collector/version.rb +1 -1
- data/lib/deprecation_collector/web/application.rb +80 -0
- data/lib/deprecation_collector/web/helpers.rb +43 -0
- data/lib/deprecation_collector/web/router.rb +196 -0
- data/lib/deprecation_collector/web/utils.rb +52 -0
- data/lib/deprecation_collector/web/views/index.html.template.rb +95 -0
- data/lib/deprecation_collector/web/views/layout.html.template.rb +18 -0
- data/lib/deprecation_collector/web/views/show.html.template.rb +13 -0
- data/lib/deprecation_collector/web.rb +33 -0
- metadata +10 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e47433dbbd3b8de0913751e91d7c599ceae4061f33a97e335082f797d3f15a85
|
4
|
+
data.tar.gz: bfd2daa42a714075654550d8c262c5fed7398109c9a6bb0c6167e3c50e9831fc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c16f77432e628e0ab52d0753a2083fbba24c9f0b847dba9b93401b6700c88831f6dea334a4ce2f48a85ede6ee3646737075b4aadc419717d024d48a3bc0a82bd
|
7
|
+
data.tar.gz: '025851292e3ba3b80ef8b7e232bb4900eef50a83948b58f2cc70ef1e15ea1cf6f9bd959f126360690cdbcca5a88c926ea04c25733d2aadfb24ef0078359ab8c5'
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
deprecation_collector (0.
|
4
|
+
deprecation_collector (0.3.0)
|
5
5
|
redis (>= 3.0)
|
6
6
|
|
7
7
|
GEM
|
@@ -117,7 +117,7 @@ GEM
|
|
117
117
|
parser (3.1.3.0)
|
118
118
|
ast (~> 2.4.1)
|
119
119
|
racc (1.6.2)
|
120
|
-
rack (2.2.
|
120
|
+
rack (2.2.7)
|
121
121
|
rack-test (2.0.2)
|
122
122
|
rack (>= 1.3)
|
123
123
|
rails (6.0.6)
|
@@ -194,6 +194,9 @@ GEM
|
|
194
194
|
simplecov_json_formatter (~> 0.1)
|
195
195
|
simplecov-html (0.12.3)
|
196
196
|
simplecov_json_formatter (0.1.4)
|
197
|
+
slim (5.1.0)
|
198
|
+
temple (~> 0.10.0)
|
199
|
+
tilt (>= 2.0.6, < 2.2)
|
197
200
|
sprockets (4.1.1)
|
198
201
|
concurrent-ruby (~> 1.0)
|
199
202
|
rack (> 1, < 3)
|
@@ -201,13 +204,16 @@ GEM
|
|
201
204
|
actionpack (>= 5.2)
|
202
205
|
activesupport (>= 5.2)
|
203
206
|
sprockets (>= 3.0.0)
|
207
|
+
temple (0.10.0)
|
204
208
|
thor (1.2.1)
|
205
209
|
thread_safe (0.3.6)
|
210
|
+
tilt (2.1.0)
|
206
211
|
timecop (0.9.6)
|
207
212
|
timeout (0.3.1)
|
208
213
|
tzinfo (1.2.10)
|
209
214
|
thread_safe (~> 0.1)
|
210
215
|
unicode-display_width (2.3.0)
|
216
|
+
webrick (1.8.1)
|
211
217
|
websocket-driver (0.7.5)
|
212
218
|
websocket-extensions (>= 0.1.0)
|
213
219
|
websocket-extensions (0.1.5)
|
@@ -223,6 +229,7 @@ DEPENDENCIES
|
|
223
229
|
appraisal
|
224
230
|
deprecation_collector!
|
225
231
|
fakeredis
|
232
|
+
rack
|
226
233
|
rails (~> 6.0.0)
|
227
234
|
rake (~> 13.0)
|
228
235
|
redis (~> 4.8)
|
@@ -233,7 +240,9 @@ DEPENDENCIES
|
|
233
240
|
rubocop-rake
|
234
241
|
rubocop-rspec
|
235
242
|
simplecov
|
243
|
+
slim
|
236
244
|
timecop
|
245
|
+
webrick
|
237
246
|
|
238
247
|
BUNDLED WITH
|
239
248
|
2.3.10
|
data/README.md
CHANGED
@@ -45,6 +45,16 @@ Add an initializer with configuration, like
|
|
45
45
|
end
|
46
46
|
```
|
47
47
|
|
48
|
+
## Web UI
|
49
|
+
|
50
|
+
Mount the rack app into your routes:
|
51
|
+
```ruby
|
52
|
+
Rails.application.routes.draw do
|
53
|
+
require 'deprecation_collector/web'
|
54
|
+
mount DeprecationCollector::Web => '/deprecations', as: :deprecations
|
55
|
+
end
|
56
|
+
```
|
57
|
+
|
48
58
|
## Development
|
49
59
|
|
50
60
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
data/Rakefile
CHANGED
@@ -10,3 +10,17 @@ require "rubocop/rake_task"
|
|
10
10
|
RuboCop::RakeTask.new
|
11
11
|
|
12
12
|
task default: %i[spec rubocop]
|
13
|
+
|
14
|
+
task :precompile_templates do
|
15
|
+
require 'slim'
|
16
|
+
# Slim::Template.new { '.lala' }.precompiled_template
|
17
|
+
Dir['lib/deprecation_collector/web/views/*.slim'].each do |file|
|
18
|
+
target = file.sub(/\.slim\z/, '.template.rb')
|
19
|
+
puts "Compiling #{file} -> #{target}"
|
20
|
+
content = Slim::Template.new(file).precompiled_template # maybe send(:precompiled, []) is more correct
|
21
|
+
|
22
|
+
File.write(target, content)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
Rake::Task[:build].enhance [:precompile_templates]
|
@@ -22,9 +22,10 @@ Gem::Specification.new do |spec|
|
|
22
22
|
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
23
23
|
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
24
24
|
`git ls-files -z`.split("\x0").reject do |f|
|
25
|
-
(f == __FILE__) || f.match(%r{\A(?:(?:bin|test|spec|features)/|\.(?:git|travis|circleci)|appveyor)})
|
25
|
+
(f == __FILE__) || f.match(%r{\A(?:(?:bin|test|spec|features)/|\.(?:git|travis|circleci)|appveyor)}) ||
|
26
|
+
f.match(%r{\Alib/deprecation_collector/web/views/.+\.slim\z})
|
26
27
|
end
|
27
|
-
end
|
28
|
+
end + Dir['lib/deprecation_collector/web/views/*.slim'].map { |template| template.sub(/\.slim\z/, '.template.rb') }
|
28
29
|
spec.require_paths = ["lib"]
|
29
30
|
|
30
31
|
spec.add_dependency "redis", ">= 3.0"
|
@@ -0,0 +1,80 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'router'
|
4
|
+
require_relative 'helpers'
|
5
|
+
require 'pp'
|
6
|
+
|
7
|
+
class DeprecationCollector
|
8
|
+
class Web
|
9
|
+
class Application
|
10
|
+
extend Web::Router
|
11
|
+
helpers Helpers
|
12
|
+
|
13
|
+
def initialize
|
14
|
+
unless defined?(Temple::Utils) || ENV['DEPRECATION_COLLECTOR_RELOAD_WEB_TEMPLATES']
|
15
|
+
# used for escaping in compiled slim templates
|
16
|
+
require_relative 'utils'
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def call(env)
|
21
|
+
self.class.call(env)
|
22
|
+
end
|
23
|
+
|
24
|
+
root do # index
|
25
|
+
@deprecations = collector_instance.read_each.to_a
|
26
|
+
@deprecations = @deprecations.sort_by { |dep| dep[:message] } unless params[:sort] == '0'
|
27
|
+
|
28
|
+
if params[:reject]
|
29
|
+
@deprecations = @deprecations.reject { |dep| dep[:message].match?(Regexp.union(Array(params[:reject]))) }
|
30
|
+
end
|
31
|
+
|
32
|
+
if params[:realm]
|
33
|
+
@deprecations = @deprecations.select { |dep| dep[:realm].match?(Regexp.union(Array(params[:realm]))) }
|
34
|
+
end
|
35
|
+
|
36
|
+
render slim: "index.html"
|
37
|
+
end
|
38
|
+
|
39
|
+
get '/dump.json' do
|
40
|
+
render json: collector_instance.read_each.to_a
|
41
|
+
end
|
42
|
+
|
43
|
+
get '/:id' do # show
|
44
|
+
@deprecation = collector_instance.read_one(params[:id])
|
45
|
+
render slim: "show.html"
|
46
|
+
end
|
47
|
+
|
48
|
+
delete '/all' do
|
49
|
+
collector_instance.flush_redis
|
50
|
+
redirect_to deprecations_path
|
51
|
+
end
|
52
|
+
|
53
|
+
post '/enable' do
|
54
|
+
collector_instance.enable
|
55
|
+
redirect_to deprecations_path
|
56
|
+
end
|
57
|
+
|
58
|
+
delete '/disable' do
|
59
|
+
collector_instance.disable
|
60
|
+
redirect_to deprecations_path
|
61
|
+
end
|
62
|
+
|
63
|
+
# NB: order for wildcards is important
|
64
|
+
delete '/:id' do # destroy
|
65
|
+
collector_instance.delete_deprecations([params[:id]])
|
66
|
+
redirect_to deprecations_path
|
67
|
+
end
|
68
|
+
|
69
|
+
post '/trigger' do # trigger
|
70
|
+
trigger_kwargs_error_warning({ foo: nil }) if RUBY_VERSION.start_with?('2.7')
|
71
|
+
trigger_rails_deprecation
|
72
|
+
collector_instance.collect(
|
73
|
+
"TestFoo#assign_attributes called (test attr_spy) trigger_rails_deprecation", caller_locations, :attr_spy
|
74
|
+
)
|
75
|
+
collector_instance.write_to_redis(force: true)
|
76
|
+
redirect_to deprecations_path
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class DeprecationCollector
|
4
|
+
class Web
|
5
|
+
module Helpers
|
6
|
+
def collector_instance
|
7
|
+
@collector_instance || DeprecationCollector.instance
|
8
|
+
end
|
9
|
+
|
10
|
+
def root_path
|
11
|
+
# request.base_url ?
|
12
|
+
"#{env["SCRIPT_NAME"]}/"
|
13
|
+
end
|
14
|
+
|
15
|
+
def current_path
|
16
|
+
@current_path ||= request.path_info.gsub(/^\//, "")
|
17
|
+
end
|
18
|
+
|
19
|
+
def deprecations_path
|
20
|
+
"#{root_path}"
|
21
|
+
end
|
22
|
+
|
23
|
+
def deprecation_path(id)
|
24
|
+
"#{root_path}#{id}"
|
25
|
+
end
|
26
|
+
|
27
|
+
def enable_deprecations_path
|
28
|
+
"#{root_path}enable"
|
29
|
+
end
|
30
|
+
|
31
|
+
def disable_deprecations_path
|
32
|
+
"#{root_path}disable"
|
33
|
+
end
|
34
|
+
|
35
|
+
def trigger_kwargs_error_warning(foo: nil); end
|
36
|
+
|
37
|
+
def trigger_rails_deprecation
|
38
|
+
return unless defined?(ActiveSupport::Deprecation)
|
39
|
+
-> { ActiveSupport::Deprecation.warn("Test deprecation") } []
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,196 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class DeprecationCollector
|
4
|
+
class Web
|
5
|
+
module Router
|
6
|
+
HTTP_METHODS = %w[GET HEAD POST PUT PATCH DELETE].freeze
|
7
|
+
HTTP_METHODS.each do |http_method|
|
8
|
+
const_set http_method, http_method
|
9
|
+
class_eval <<~RUBY, __FILE__, __LINE__+1
|
10
|
+
def #{http_method.downcase}(path, &block)
|
11
|
+
route(#{http_method}, path, &block)
|
12
|
+
end
|
13
|
+
RUBY
|
14
|
+
end
|
15
|
+
|
16
|
+
def root(&block)
|
17
|
+
route(GET, '/', &block)
|
18
|
+
end
|
19
|
+
|
20
|
+
def route(method, path, &block)
|
21
|
+
((@routes ||= {})[method] ||= []) << Route.new(method, path, block)
|
22
|
+
end
|
23
|
+
|
24
|
+
def helpers(mod = nil, &block)
|
25
|
+
return ActionContext.class_eval(&block) if block
|
26
|
+
ActionContext.send(:include, mod)
|
27
|
+
end
|
28
|
+
|
29
|
+
|
30
|
+
ROUTE_PARAMS = "rack.route_params"
|
31
|
+
PATH_INFO = "PATH_INFO"
|
32
|
+
|
33
|
+
def match(env)
|
34
|
+
request = ::Rack::Request.new(env)
|
35
|
+
request_method = request.request_method
|
36
|
+
request_method = request.params["_method"] if request.params["_method"]
|
37
|
+
|
38
|
+
path_info = ::Rack::Utils.unescape env[PATH_INFO]
|
39
|
+
path_info = "/" if path_info == "" # some buggy servers may pass empty root path
|
40
|
+
|
41
|
+
@routes[request_method.upcase]&.find do |route|
|
42
|
+
params = route.match(request_method, path_info)
|
43
|
+
next unless params
|
44
|
+
env[ROUTE_PARAMS] = params
|
45
|
+
break ActionContext.new(request, &route.block)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def call(env)
|
50
|
+
action = match(env)
|
51
|
+
unless action
|
52
|
+
return [
|
53
|
+
404,
|
54
|
+
{"content-type" => "text/plain", "x-cascade" => "pass"},
|
55
|
+
["Not Found #{env["REQUEST_METHOD"].inspect} #{env[PATH_INFO].inspect}"]
|
56
|
+
]
|
57
|
+
end
|
58
|
+
|
59
|
+
resp = catch(:halt) do
|
60
|
+
action.call(env)
|
61
|
+
ensure
|
62
|
+
end
|
63
|
+
|
64
|
+
return resp if resp.is_a?(Array) # raw rack responses (redirects etc.)
|
65
|
+
|
66
|
+
# rendered content goes here
|
67
|
+
headers = {
|
68
|
+
"content-type" => "text/html",
|
69
|
+
"cache-control" => "private, no-store",
|
70
|
+
# TODO:
|
71
|
+
# "content-language" => action.locale,
|
72
|
+
# "content-security-policy" => CSP_HEADER
|
73
|
+
}
|
74
|
+
# we'll let Rack calculate Content-Length for us.
|
75
|
+
[200, headers, [resp]]
|
76
|
+
end
|
77
|
+
|
78
|
+
class Route
|
79
|
+
attr_accessor :request_method, :pattern, :block
|
80
|
+
|
81
|
+
NAMED_SEGMENTS_PATTERN = /\/([^\/]*):([^.:$\/]+)/
|
82
|
+
|
83
|
+
def initialize(request_method, pattern, block)
|
84
|
+
@request_method = request_method
|
85
|
+
@pattern = pattern
|
86
|
+
@block = block
|
87
|
+
end
|
88
|
+
|
89
|
+
def matcher
|
90
|
+
@matcher ||= compile_matcher
|
91
|
+
end
|
92
|
+
|
93
|
+
def compile_matcher
|
94
|
+
return pattern unless pattern.match?(NAMED_SEGMENTS_PATTERN)
|
95
|
+
regex_pattern = pattern.gsub(NAMED_SEGMENTS_PATTERN, '/\1(?<\2>[^$/]+)') # /some/:id => /some/(?<id>[^$/]+)
|
96
|
+
|
97
|
+
Regexp.new("\\A#{regex_pattern}\\Z")
|
98
|
+
end
|
99
|
+
|
100
|
+
def match(request_method, path)
|
101
|
+
case matcher
|
102
|
+
when String
|
103
|
+
{} if path == matcher
|
104
|
+
else
|
105
|
+
path_match = path.match(matcher)
|
106
|
+
path_match&.named_captures&.transform_keys(&:to_sym)
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
class ActionContext
|
112
|
+
attr_accessor :request
|
113
|
+
|
114
|
+
def initialize(request, &block)
|
115
|
+
@request = request
|
116
|
+
@block = block
|
117
|
+
end
|
118
|
+
|
119
|
+
def call(env)
|
120
|
+
instance_exec(&@block)
|
121
|
+
end
|
122
|
+
|
123
|
+
def env
|
124
|
+
request.env
|
125
|
+
end
|
126
|
+
|
127
|
+
def route_params
|
128
|
+
env[Router::ROUTE_PARAMS]
|
129
|
+
end
|
130
|
+
|
131
|
+
def params
|
132
|
+
@params ||= Hash.new { |hash, key| hash[key.to_s] if Symbol === key }
|
133
|
+
.merge!(request.params)
|
134
|
+
.merge!(route_params.transform_keys(&:to_s))
|
135
|
+
end
|
136
|
+
|
137
|
+
def halt(res)
|
138
|
+
throw :halt, [res, {"content-type" => "text/plain"}, [res.to_s]]
|
139
|
+
end
|
140
|
+
|
141
|
+
def redirect_to(location)
|
142
|
+
throw :halt, [302, {"location" => "#{request.base_url}#{location}"}, []]
|
143
|
+
end
|
144
|
+
|
145
|
+
def render(plain: nil, html: nil, json: nil, erb: nil, slim: nil, status: 200, locals: nil, layout: 'layout.html.slim')
|
146
|
+
raise ArgumentError, "provide exactly one render format" unless [plain, html, json, erb, slim].compact.size == 1
|
147
|
+
|
148
|
+
return [status, {"content-type" => "application/json"}, [JSON.generate(json)]] if json
|
149
|
+
return [status, {"content-type" => "text/plain"}, [plain.to_s]] if plain
|
150
|
+
|
151
|
+
_define_locals(locals) if locals
|
152
|
+
template = "#{erb}.erb" if erb
|
153
|
+
template = "#{slim}.slim" if slim
|
154
|
+
html = render_template(template) if template
|
155
|
+
html = render_template(layout) { html } if layout
|
156
|
+
|
157
|
+
return [status, {"content-type" => "text/html"}, [html.to_s]] if html
|
158
|
+
end
|
159
|
+
|
160
|
+
VIEW_PATH = "#{__dir__}/views"
|
161
|
+
|
162
|
+
def render_template(template, &block)
|
163
|
+
original_template_name = File.join(VIEW_PATH, template.to_s)
|
164
|
+
template = template.gsub(/\.slim\z/, '.template.rb')
|
165
|
+
template_method_name = "_template_#{template.gsub(/[^\w]/, '_')}"
|
166
|
+
template_filename = File.join(VIEW_PATH, template.to_s)
|
167
|
+
|
168
|
+
if ENV['DEPRECATION_COLLECTOR_RELOAD_WEB_TEMPLATES']
|
169
|
+
require 'slim'
|
170
|
+
puts "Recompiling #{original_template_name}"
|
171
|
+
ActionContext.class_eval { undef_method(template_method_name) } if respond_to?(template_method_name)
|
172
|
+
if original_template_name.end_with?('.slim')
|
173
|
+
File.write(template_filename, Slim::Template.new(original_template_name).precompiled_template)
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
unless respond_to?(template_method_name)
|
178
|
+
src = File.read(template_filename)
|
179
|
+
src = ERB.new(src).src if template_filename.end_with?('.erb')
|
180
|
+
ActionContext.class_eval <<-RUBY, template_filename.gsub(/\.template\.rb\z/, '.slim'), 1
|
181
|
+
def #{template_method_name}; #{src}
|
182
|
+
end
|
183
|
+
RUBY
|
184
|
+
end
|
185
|
+
|
186
|
+
send(template_method_name, &block)
|
187
|
+
end
|
188
|
+
|
189
|
+
private
|
190
|
+
def _define_locals(locals)
|
191
|
+
locals&.each { |k, v| define_singleton_method(k) { v } unless singleton_methods.include?(k) }
|
192
|
+
end
|
193
|
+
end
|
194
|
+
end
|
195
|
+
end
|
196
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
|
2
|
+
begin
|
3
|
+
require 'cgi/escape'
|
4
|
+
rescue LoadError
|
5
|
+
end
|
6
|
+
|
7
|
+
module Temple
|
8
|
+
# @api public
|
9
|
+
module Utils
|
10
|
+
extend self
|
11
|
+
|
12
|
+
# Returns an escaped copy of `html`.
|
13
|
+
# Strings which are declared as html_safe are not escaped.
|
14
|
+
#
|
15
|
+
# @param html [String] The string to escape
|
16
|
+
# @return [String] The escaped string
|
17
|
+
def escape_html_safe(html)
|
18
|
+
s = html.to_s
|
19
|
+
s.html_safe? || html.html_safe? ? s : escape_html(s)
|
20
|
+
end
|
21
|
+
|
22
|
+
if defined?(CGI.escapeHTML)
|
23
|
+
# Returns an escaped copy of `html`.
|
24
|
+
#
|
25
|
+
# @param html [String] The string to escape
|
26
|
+
# @return [String] The escaped string
|
27
|
+
def escape_html(html)
|
28
|
+
CGI.escapeHTML(html.to_s)
|
29
|
+
end
|
30
|
+
else
|
31
|
+
# Used by escape_html
|
32
|
+
# @api private
|
33
|
+
ESCAPE_HTML = {
|
34
|
+
'&' => '&',
|
35
|
+
'"' => '"',
|
36
|
+
'\'' => ''',
|
37
|
+
'<' => '<',
|
38
|
+
'>' => '>'
|
39
|
+
}.freeze
|
40
|
+
|
41
|
+
ESCAPE_HTML_PATTERN = Regexp.union(*ESCAPE_HTML.keys)
|
42
|
+
|
43
|
+
# Returns an escaped copy of `html`.
|
44
|
+
#
|
45
|
+
# @param html [String] The string to escape
|
46
|
+
# @return [String] The escaped string
|
47
|
+
def escape_html(html)
|
48
|
+
html.to_s.gsub(ESCAPE_HTML_PATTERN, ESCAPE_HTML)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
_buf = ''; _buf << ("<header><h1>Deprecations</h1><a class=\"btn btn-primary\" data-method=\"post\"".freeze);
|
2
|
+
;
|
3
|
+
;
|
4
|
+
; _slim_codeattributes1 = deprecation_path(:trigger); if _slim_codeattributes1; if _slim_codeattributes1 == true; _buf << (" href=\"\"".freeze); else; _buf << (" href=\"".freeze); _buf << ((::Temple::Utils.escape_html((_slim_codeattributes1))).to_s); _buf << ("\"".freeze); end; end; _buf << (" rel=\"nofollow\">Trigger a couple</a> <a class=\"btn btn-danger\" data-confirm=\"Sure?\" data-method=\"delete\"".freeze);
|
5
|
+
; _slim_codeattributes2 = deprecation_path(:all); if _slim_codeattributes2; if _slim_codeattributes2 == true; _buf << (" href=\"\"".freeze); else; _buf << (" href=\"".freeze); _buf << ((::Temple::Utils.escape_html((_slim_codeattributes2))).to_s); _buf << ("\"".freeze); end; end; _buf << (" rel=\"nofollow\"><i class=\"bi bi-trash\"></i>Delete all </a> ".freeze);
|
6
|
+
;
|
7
|
+
;
|
8
|
+
;
|
9
|
+
; if DeprecationCollector.instance.enabled_in_redis?;
|
10
|
+
;
|
11
|
+
;
|
12
|
+
;
|
13
|
+
; _buf << ("<a class=\"btn btn-danger\" data-confirm=\"Sure? Will need to restart workers after enabling\" data-method=\"delete\"".freeze); _slim_codeattributes3 = disable_deprecations_path; if _slim_codeattributes3; if _slim_codeattributes3 == true; _buf << (" href=\"\"".freeze); else; _buf << (" href=\"".freeze); _buf << ((::Temple::Utils.escape_html((_slim_codeattributes3))).to_s); _buf << ("\"".freeze); end; end; _buf << (" rel=\"nofollow\">Disable</a> ".freeze);
|
14
|
+
; else;
|
15
|
+
;
|
16
|
+
;
|
17
|
+
; _buf << ("<a class=\"btn btn-secondary\" data-method=\"post\"".freeze); _slim_codeattributes4 = enable_deprecations_path; if _slim_codeattributes4; if _slim_codeattributes4 == true; _buf << (" href=\"\"".freeze); else; _buf << (" href=\"".freeze); _buf << ((::Temple::Utils.escape_html((_slim_codeattributes4))).to_s); _buf << ("\"".freeze); end; end; _buf << (" rel=\"nofollow\">Turn on (after workers restart)</a> ".freeze);
|
18
|
+
;
|
19
|
+
; end; _buf << ("</header><main><table class=\"table table-striped\"><tr><th>Count</th><th>Message</th><th>Location</th><th>Ruby/Rails</th></tr>".freeze);
|
20
|
+
;
|
21
|
+
;
|
22
|
+
;
|
23
|
+
;
|
24
|
+
;
|
25
|
+
;
|
26
|
+
;
|
27
|
+
; total = 0;
|
28
|
+
; @deprecations.each do |deprecation|;
|
29
|
+
; total += 1;
|
30
|
+
; _buf << ("<tr".freeze); _slim_codeattributes5 = deprecation[:digest]; if _slim_codeattributes5; if _slim_codeattributes5 == true; _buf << (" data-digest=\"\"".freeze); else; _buf << (" data-digest=\"".freeze); _buf << ((::Temple::Utils.escape_html((_slim_codeattributes5))).to_s); _buf << ("\"".freeze); end; end; _buf << ("><td><a".freeze);
|
31
|
+
;
|
32
|
+
; _slim_codeattributes6 = deprecation_path(deprecation[:digest]); if _slim_codeattributes6; if _slim_codeattributes6 == true; _buf << (" href=\"\"".freeze); else; _buf << (" href=\"".freeze); _buf << ((::Temple::Utils.escape_html((_slim_codeattributes6))).to_s); _buf << ("\"".freeze); end; end; _buf << (">".freeze); _buf << ((::Temple::Utils.escape_html((deprecation[:count]))).to_s);
|
33
|
+
; _buf << ("</a><br />".freeze);
|
34
|
+
; if deprecation[:message].include?("Using the last argument as keyword parameters is deprecated") || \
|
35
|
+
deprecation[:message].include?("Passing the keyword argument as the last hash parameter is deprecated");
|
36
|
+
; _buf << ("<div class=\"badge bg-secondary\">kwargs</div> ".freeze);
|
37
|
+
; end; if deprecation[:message].include?("trigger_kwargs_error_warning") || \
|
38
|
+
deprecation[:message].include?("trigger_rails_deprecation");
|
39
|
+
; _buf << ("<div class=\"badge bg-success\">test</div> ".freeze);
|
40
|
+
; end; if deprecation[:realm] && deprecation[:realm] != 'rails';
|
41
|
+
; _buf << ("<div class=\"badge bg-secondary\">".freeze); _buf << ((::Temple::Utils.escape_html((deprecation[:realm]))).to_s);
|
42
|
+
; _buf << ("</div> ".freeze); end; deprecation.dig(:notes, :tags)&.each do |tag|;
|
43
|
+
; _buf << ("<div class=\"badge bg-secondary\">".freeze); _buf << ((::Temple::Utils.escape_html((tag))).to_s);
|
44
|
+
;
|
45
|
+
; _buf << ("</div> ".freeze); end; _buf << ("</td><td>".freeze);
|
46
|
+
;
|
47
|
+
; msg = deprecation[:message]
|
48
|
+
delete_prefixes = Gem.path + [defined?(Rails) && Rails.root.to_s].compact
|
49
|
+
delete_prefixes.each { |path| msg.gsub!(path, '') }
|
50
|
+
;
|
51
|
+
; _buf << ("<div class=\"card text-dark bg-light\"><pre class=\"pre-scrollable\" style=\"overflow: auto; max-width: 700px; max-height: 200px; font-size: 11px\"><code>".freeze);
|
52
|
+
;
|
53
|
+
; _buf << ((::Temple::Utils.escape_html((msg.delete_prefix("DEPRECATION WARNING: ")))).to_s);
|
54
|
+
; _buf << ("</code></pre></div>".freeze); if deprecation.dig(:notes, :comment);
|
55
|
+
; _buf << ((::Temple::Utils.escape_html((deprecation.dig(:notes, :comment)))).to_s);
|
56
|
+
;
|
57
|
+
; end; if deprecation.dig(:context, :action);
|
58
|
+
; _buf << ("<div class=\"small controller\">".freeze); _buf << ((::Temple::Utils.escape_html((deprecation.dig(:context, :action)))).to_s);
|
59
|
+
; _buf << ("</div>".freeze); elsif deprecation.dig(:context, :params, :controller);
|
60
|
+
; _buf << ("<div class=\"small controller\">".freeze); _buf << ((::Temple::Utils.escape_html((deprecation.dig(:context, :params).slice(:controller, :action).values.join('#')))).to_s);
|
61
|
+
; _buf << ("</div>".freeze); end; _buf << ("</td><td>".freeze);
|
62
|
+
; if deprecation[:gem_traceline];
|
63
|
+
; _buf << ((::Temple::Utils.escape_html((deprecation[:gem_traceline]))).to_s);
|
64
|
+
; _buf << ("<br>".freeze);
|
65
|
+
; end; if deprecation[:app_traceline];
|
66
|
+
; location, function = deprecation[:app_traceline].split(':in `', 2);
|
67
|
+
; _buf << ("<code class=\"code_location\" style=\"cursor: pointer\">".freeze); _buf << ((::Temple::Utils.escape_html((location))).to_s);
|
68
|
+
; _buf << ("</code> ".freeze); _buf << ((::Temple::Utils.escape_html((function.delete_suffix("'")))).to_s);
|
69
|
+
; end; _buf << ("</td><td><div class=\"small ruby\">".freeze);
|
70
|
+
; _buf << ((::Temple::Utils.escape_html((deprecation[:ruby_version]))).to_s);
|
71
|
+
; _buf << ("</div><div class=\"small rails\">".freeze); _buf << ((::Temple::Utils.escape_html((deprecation[:rails_version]))).to_s);
|
72
|
+
;
|
73
|
+
; _buf << ("</div><a data-confirm=\"Delete?\" data-method=\"delete\"".freeze); _slim_codeattributes7 = deprecation_path(deprecation[:digest]); if _slim_codeattributes7; if _slim_codeattributes7 == true; _buf << (" href=\"\"".freeze); else; _buf << (" href=\"".freeze); _buf << ((::Temple::Utils.escape_html((_slim_codeattributes7))).to_s); _buf << ("\"".freeze); end; end; _buf << (" rel=\"nofollow\" title=\"Delete\"><i class=\"bi bi-trash\"></i></a></td></tr>".freeze);
|
74
|
+
;
|
75
|
+
; end; if total.zero?;
|
76
|
+
; _buf << ("<tr><td".freeze);
|
77
|
+
; _slim_codeattributes8 = 4; if _slim_codeattributes8; if _slim_codeattributes8 == true; _buf << (" colspan=\"\"".freeze); else; _buf << (" colspan=\"".freeze); _buf << ((::Temple::Utils.escape_html((_slim_codeattributes8))).to_s); _buf << ("\"".freeze); end; end; _buf << ("><p>Looks like there're no deprecations</p><p>You can try <a data-method=\"post\"".freeze);
|
78
|
+
;
|
79
|
+
;
|
80
|
+
;
|
81
|
+
; _slim_codeattributes9 = deprecation_path(:trigger); if _slim_codeattributes9; if _slim_codeattributes9 == true; _buf << (" href=\"\"".freeze); else; _buf << (" href=\"".freeze); _buf << ((::Temple::Utils.escape_html((_slim_codeattributes9))).to_s); _buf << ("\"".freeze); end; end; _buf << (" rel=\"nofollow\">trigger a couple</a></p></td></tr>".freeze);
|
82
|
+
;
|
83
|
+
; end; _buf << ("</table></main><footer>".freeze);
|
84
|
+
; if total > 3;
|
85
|
+
; _buf << ((::Temple::Utils.escape_html((total))).to_s);
|
86
|
+
; _buf << (" deprecations ".freeze);
|
87
|
+
;
|
88
|
+
; end; _buf << ("</footer><script>document.querySelectorAll('.code_location').forEach(function(elem){\n elem.addEventListener('click', function () {\n console.log(\"Copying\", elem.innerText)\n navigator.clipboard.writeText(elem.innerText);\n }, false);\n});</script>".freeze);
|
89
|
+
;
|
90
|
+
;
|
91
|
+
;
|
92
|
+
;
|
93
|
+
;
|
94
|
+
;
|
95
|
+
; _buf
|
@@ -0,0 +1,18 @@
|
|
1
|
+
_buf = ''; _buf << ("<!DOCTYPE html><html><head><meta charset=\"utf-8\" /><meta content=\"IE=edge;chrome=1\" http-equiv=\"X-UA-Compatible\" /><title>".freeze);
|
2
|
+
;
|
3
|
+
;
|
4
|
+
;
|
5
|
+
;
|
6
|
+
;
|
7
|
+
; _buf << ((::Temple::Utils.escape_html(("Deprecations"))).to_s);
|
8
|
+
; _buf << ("</title><meta content=\"\" name=\"description\" /><meta content=\"width=device-width\" name=\"viewport\" /><link href=\"https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css\" rel=\"stylesheet\" /><link href=\"https://cdn.jsdelivr.net/npm/bootstrap-icons@1.10.2/font/bootstrap-icons.css\" rel=\"stylesheet\" /></head><body><div class=\"container-fluid\">".freeze);
|
9
|
+
;
|
10
|
+
;
|
11
|
+
;
|
12
|
+
;
|
13
|
+
;
|
14
|
+
;
|
15
|
+
; _buf << ((yield).to_s);
|
16
|
+
;
|
17
|
+
; _buf << ("</div><script src=\"https://cdn.jsdelivr.net/npm/rails-ujs@5.2.8-1/lib/assets/compiled/rails-ujs.min.js\"></script></body></html>".freeze);
|
18
|
+
; _buf
|
@@ -0,0 +1,13 @@
|
|
1
|
+
_buf = ''; _buf << ("<header class=\"mb-3\"><h1>Deprecation</h1><a class=\"btn btn-secondary\"".freeze);
|
2
|
+
;
|
3
|
+
;
|
4
|
+
; _slim_codeattributes1 = deprecations_path; if _slim_codeattributes1; if _slim_codeattributes1 == true; _buf << (" href=\"\"".freeze); else; _buf << (" href=\"".freeze); _buf << ((::Temple::Utils.escape_html((_slim_codeattributes1))).to_s); _buf << ("\"".freeze); end; end; _buf << (">Back</a><a class=\"btn btn-danger\" data-confirm=\"Delete?\" data-method=\"delete\"".freeze);
|
5
|
+
; _slim_codeattributes2 = deprecation_path(@deprecation[:digest]); if _slim_codeattributes2; if _slim_codeattributes2 == true; _buf << (" href=\"\"".freeze); else; _buf << (" href=\"".freeze); _buf << ((::Temple::Utils.escape_html((_slim_codeattributes2))).to_s); _buf << ("\"".freeze); end; end; _buf << (" rel=\"nofollow\" title=\"Delete\"><span class=\"glyphicon glyphicon-trash insalesicon-trash\"></span>Delete</a></header><main><div class=\"card text-dark bg-light p-3\"><pre><code>".freeze);
|
6
|
+
;
|
7
|
+
;
|
8
|
+
;
|
9
|
+
;
|
10
|
+
;
|
11
|
+
;
|
12
|
+
; _buf << ((::Temple::Utils.escape_html((@deprecation.pretty_inspect))).to_s);
|
13
|
+
; _buf << ("</code></pre></div></main>".freeze); _buf
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "erb"
|
4
|
+
require "rack/content_length"
|
5
|
+
require "rack/builder"
|
6
|
+
|
7
|
+
require_relative 'web/application'
|
8
|
+
|
9
|
+
class DeprecationCollector
|
10
|
+
class Web
|
11
|
+
def self.call(env)
|
12
|
+
@app ||= new
|
13
|
+
@app.call(env)
|
14
|
+
end
|
15
|
+
|
16
|
+
def call(env)
|
17
|
+
app.call(env)
|
18
|
+
end
|
19
|
+
|
20
|
+
def app
|
21
|
+
@app ||= build
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
def build
|
26
|
+
::Rack::Builder.new do
|
27
|
+
# use Rack::Static etc goes here
|
28
|
+
|
29
|
+
run Web::Application.new
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: deprecation_collector
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Vasily Fedoseyev
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-04-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: redis
|
@@ -67,6 +67,14 @@ files:
|
|
67
67
|
- lib/deprecation_collector/collectors.rb
|
68
68
|
- lib/deprecation_collector/deprecation.rb
|
69
69
|
- lib/deprecation_collector/version.rb
|
70
|
+
- lib/deprecation_collector/web.rb
|
71
|
+
- lib/deprecation_collector/web/application.rb
|
72
|
+
- lib/deprecation_collector/web/helpers.rb
|
73
|
+
- lib/deprecation_collector/web/router.rb
|
74
|
+
- lib/deprecation_collector/web/utils.rb
|
75
|
+
- lib/deprecation_collector/web/views/index.html.template.rb
|
76
|
+
- lib/deprecation_collector/web/views/layout.html.template.rb
|
77
|
+
- lib/deprecation_collector/web/views/show.html.template.rb
|
70
78
|
- sig/deprecation_collector.rbs
|
71
79
|
homepage: https://github.com/Vasfed/deprecation_collector
|
72
80
|
licenses:
|