deprecation_collector 0.3.0 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +2 -0
- data/CHANGELOG.md +14 -0
- data/Gemfile +4 -4
- data/Gemfile.lock +3 -2
- data/Rakefile +10 -6
- data/deprecation_collector.gemspec +2 -1
- data/gemfiles/rails_6.gemfile +3 -0
- data/gemfiles/rails_6.gemfile.lock +90 -86
- data/gemfiles/rails_7.gemfile +3 -0
- data/gemfiles/rails_7.gemfile.lock +85 -75
- data/gemfiles/rails_none.gemfile +3 -0
- data/gemfiles/rails_none.gemfile.lock +20 -7
- data/lib/deprecation_collector/deprecation.rb +2 -1
- data/lib/deprecation_collector/storage.rb +205 -0
- data/lib/deprecation_collector/version.rb +1 -1
- data/lib/deprecation_collector/web/application.rb +42 -20
- data/lib/deprecation_collector/web/helpers.rb +48 -4
- data/lib/deprecation_collector/web/router.rb +76 -49
- data/lib/deprecation_collector/web/utils.rb +10 -7
- data/lib/deprecation_collector/web/views/import.html.template.rb +13 -0
- data/lib/deprecation_collector/web/views/index.html.template.rb +57 -31
- data/lib/deprecation_collector/web/views/layout.html.template.rb +77 -4
- data/lib/deprecation_collector/web/views/show.html.template.rb +73 -4
- data/lib/deprecation_collector/web.rb +11 -2
- data/lib/deprecation_collector.rb +88 -116
- metadata +19 -3
@@ -2,26 +2,31 @@
|
|
2
2
|
|
3
3
|
class DeprecationCollector
|
4
4
|
class Web
|
5
|
+
# :nodoc:
|
5
6
|
module Helpers
|
6
7
|
def collector_instance
|
7
8
|
@collector_instance || DeprecationCollector.instance
|
8
9
|
end
|
9
10
|
|
11
|
+
def import_enabled?
|
12
|
+
@web.import_enabled
|
13
|
+
end
|
14
|
+
|
10
15
|
def root_path
|
11
16
|
# request.base_url ?
|
12
17
|
"#{env["SCRIPT_NAME"]}/"
|
13
18
|
end
|
14
19
|
|
15
20
|
def current_path
|
16
|
-
@current_path ||= request.path_info.gsub(
|
21
|
+
@current_path ||= request.path_info.gsub(%r{^/}, "")
|
17
22
|
end
|
18
23
|
|
19
24
|
def deprecations_path
|
20
|
-
|
25
|
+
root_path # /
|
21
26
|
end
|
22
27
|
|
23
|
-
def deprecation_path(id)
|
24
|
-
"#{root_path}#{id}"
|
28
|
+
def deprecation_path(id, format: nil)
|
29
|
+
["#{root_path}#{id}", format].compact.join('.')
|
25
30
|
end
|
26
31
|
|
27
32
|
def enable_deprecations_path
|
@@ -32,12 +37,51 @@ class DeprecationCollector
|
|
32
37
|
"#{root_path}disable"
|
33
38
|
end
|
34
39
|
|
40
|
+
def dump_deprecations_path
|
41
|
+
"#{root_path}dump.json"
|
42
|
+
end
|
43
|
+
|
44
|
+
def import_deprecations_path
|
45
|
+
"#{root_path}import"
|
46
|
+
end
|
47
|
+
|
35
48
|
def trigger_kwargs_error_warning(foo: nil); end
|
36
49
|
|
37
50
|
def trigger_rails_deprecation
|
38
51
|
return unless defined?(ActiveSupport::Deprecation)
|
52
|
+
|
39
53
|
-> { ActiveSupport::Deprecation.warn("Test deprecation") } []
|
40
54
|
end
|
55
|
+
|
56
|
+
def current_color_theme
|
57
|
+
return "dark" if params["dark"]
|
58
|
+
return "light" if params["light"]
|
59
|
+
return "dark" if request.get_header("HTTP_Sec_CH_Prefers_Color_Scheme").to_s.downcase.include?("dark")
|
60
|
+
|
61
|
+
"auto"
|
62
|
+
end
|
63
|
+
|
64
|
+
def detect_tag(deprecation)
|
65
|
+
msg = deprecation[:message]
|
66
|
+
return :kwargs if msg.include?("Using the last argument as keyword parameters is deprecated") ||
|
67
|
+
msg.include?("Passing the keyword argument as the last hash parameter is deprecated")
|
68
|
+
return :test if msg.include?("trigger_kwargs_error_warning") || msg.include?("trigger_rails_deprecation")
|
69
|
+
end
|
70
|
+
|
71
|
+
def deprecation_tags(deprecation)
|
72
|
+
tags = Set.new
|
73
|
+
if (detected_tag = detect_tag(deprecation))
|
74
|
+
tags << detected_tag
|
75
|
+
end
|
76
|
+
tags << deprecation[:realm] if deprecation[:realm] && deprecation[:realm] != "rails"
|
77
|
+
tags.merge(deprecation.dig(:notes, :tags) || [])
|
78
|
+
|
79
|
+
tags.to_h do |tag|
|
80
|
+
next [tag, "bg-success"] if tag == :test
|
81
|
+
|
82
|
+
[tag, "bg-secondary"]
|
83
|
+
end
|
84
|
+
end
|
41
85
|
end
|
42
86
|
end
|
43
87
|
end
|
@@ -2,19 +2,20 @@
|
|
2
2
|
|
3
3
|
class DeprecationCollector
|
4
4
|
class Web
|
5
|
+
# :nodoc:
|
5
6
|
module Router
|
6
7
|
HTTP_METHODS = %w[GET HEAD POST PUT PATCH DELETE].freeze
|
7
8
|
HTTP_METHODS.each do |http_method|
|
8
9
|
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
|
10
|
+
class_eval <<~RUBY, __FILE__, __LINE__ + 1
|
11
|
+
def #{http_method.downcase}(path, &block) # def get(path, &block)
|
12
|
+
route(#{http_method}, path, &block) # route('GET', path, &block)
|
13
|
+
end # end
|
13
14
|
RUBY
|
14
15
|
end
|
15
16
|
|
16
17
|
def root(&block)
|
17
|
-
route(GET,
|
18
|
+
route(GET, "/", &block)
|
18
19
|
end
|
19
20
|
|
20
21
|
def route(method, path, &block)
|
@@ -23,10 +24,10 @@ class DeprecationCollector
|
|
23
24
|
|
24
25
|
def helpers(mod = nil, &block)
|
25
26
|
return ActionContext.class_eval(&block) if block
|
27
|
+
|
26
28
|
ActionContext.send(:include, mod)
|
27
29
|
end
|
28
30
|
|
29
|
-
|
30
31
|
ROUTE_PARAMS = "rack.route_params"
|
31
32
|
PATH_INFO = "PATH_INFO"
|
32
33
|
|
@@ -39,35 +40,33 @@ class DeprecationCollector
|
|
39
40
|
path_info = "/" if path_info == "" # some buggy servers may pass empty root path
|
40
41
|
|
41
42
|
@routes[request_method.upcase]&.find do |route|
|
42
|
-
params = route.match(request_method, path_info)
|
43
|
+
params = route.match(request_method.upcase, path_info)
|
43
44
|
next unless params
|
45
|
+
|
44
46
|
env[ROUTE_PARAMS] = params
|
45
47
|
break ActionContext.new(request, &route.block)
|
46
48
|
end
|
47
49
|
end
|
48
50
|
|
49
|
-
def call(env)
|
51
|
+
def call(env, application = nil)
|
50
52
|
action = match(env)
|
51
53
|
unless action
|
52
54
|
return [
|
53
55
|
404,
|
54
|
-
{"content-type" => "text/plain", "x-cascade" => "pass"},
|
56
|
+
{ "content-type" => "text/plain", "x-cascade" => "pass" },
|
55
57
|
["Not Found #{env["REQUEST_METHOD"].inspect} #{env[PATH_INFO].inspect}"]
|
56
58
|
]
|
57
59
|
end
|
58
60
|
|
59
|
-
resp = catch(:halt)
|
60
|
-
action.call(env)
|
61
|
-
ensure
|
62
|
-
end
|
61
|
+
resp = catch(:halt) { action.call(env, application) }
|
63
62
|
|
64
63
|
return resp if resp.is_a?(Array) # raw rack responses (redirects etc.)
|
65
64
|
|
66
65
|
# rendered content goes here
|
67
66
|
headers = {
|
68
67
|
"content-type" => "text/html",
|
69
|
-
"cache-control" => "private, no-store"
|
70
|
-
# TODO:
|
68
|
+
"cache-control" => "private, no-store"
|
69
|
+
# TODO: locale/csp
|
71
70
|
# "content-language" => action.locale,
|
72
71
|
# "content-security-policy" => CSP_HEADER
|
73
72
|
}
|
@@ -75,10 +74,11 @@ class DeprecationCollector
|
|
75
74
|
[200, headers, [resp]]
|
76
75
|
end
|
77
76
|
|
77
|
+
# :nodoc:
|
78
78
|
class Route
|
79
79
|
attr_accessor :request_method, :pattern, :block
|
80
80
|
|
81
|
-
NAMED_SEGMENTS_PATTERN =
|
81
|
+
NAMED_SEGMENTS_PATTERN = %r{/([^/]*):([^.:$/]+)}.freeze
|
82
82
|
|
83
83
|
def initialize(request_method, pattern, block)
|
84
84
|
@request_method = request_method
|
@@ -92,12 +92,15 @@ class DeprecationCollector
|
|
92
92
|
|
93
93
|
def compile_matcher
|
94
94
|
return pattern unless pattern.match?(NAMED_SEGMENTS_PATTERN)
|
95
|
-
regex_pattern = pattern.gsub(NAMED_SEGMENTS_PATTERN, '/\1(?<\2>[^$/]+)') # /some/:id => /some/(?<id>[^$/]+)
|
96
95
|
|
96
|
+
regex_pattern = pattern.gsub(NAMED_SEGMENTS_PATTERN, '/\1(?<\2>[^$/]+)') # /some/:id => /some/(?<id>[^$/]+)
|
97
97
|
Regexp.new("\\A#{regex_pattern}\\Z")
|
98
98
|
end
|
99
99
|
|
100
100
|
def match(request_method, path)
|
101
|
+
# this is actually not needed because of groupping by method, but just in case:
|
102
|
+
return unless self.request_method == request_method
|
103
|
+
|
101
104
|
case matcher
|
102
105
|
when String
|
103
106
|
{} if path == matcher
|
@@ -108,6 +111,7 @@ class DeprecationCollector
|
|
108
111
|
end
|
109
112
|
end
|
110
113
|
|
114
|
+
# :nodoc:
|
111
115
|
class ActionContext
|
112
116
|
attr_accessor :request
|
113
117
|
|
@@ -116,7 +120,8 @@ class DeprecationCollector
|
|
116
120
|
@block = block
|
117
121
|
end
|
118
122
|
|
119
|
-
def call(
|
123
|
+
def call(_env, application)
|
124
|
+
@web = application.web
|
120
125
|
instance_exec(&@block)
|
121
126
|
end
|
122
127
|
|
@@ -129,24 +134,30 @@ class DeprecationCollector
|
|
129
134
|
end
|
130
135
|
|
131
136
|
def params
|
132
|
-
@params ||= Hash.new { |hash, key| hash[key.to_s] if Symbol
|
133
|
-
|
134
|
-
|
137
|
+
@params ||= Hash.new { |hash, key| hash[key.to_s] if key.is_a?(Symbol) }
|
138
|
+
.merge!(request.params)
|
139
|
+
.merge!(route_params.transform_keys(&:to_s))
|
135
140
|
end
|
136
141
|
|
137
|
-
def halt(res)
|
138
|
-
throw :halt, [res, {"content-type" => "text/plain"}, [res.to_s]]
|
142
|
+
def halt(res, content = nil)
|
143
|
+
throw :halt, [res, { "content-type" => "text/plain" }, [content || res.to_s]]
|
139
144
|
end
|
140
145
|
|
141
146
|
def redirect_to(location)
|
142
|
-
throw :halt, [302, {"location" => "#{request.base_url}#{location}"}, []]
|
147
|
+
throw :halt, [302, { "location" => "#{request.base_url}#{location}" }, []]
|
143
148
|
end
|
144
149
|
|
145
|
-
def render(plain: nil, html: nil, json: nil, erb: nil, slim: nil,
|
146
|
-
|
150
|
+
def render(plain: nil, html: nil, json: nil, erb: nil, slim: nil, # rubocop:disable Metrics
|
151
|
+
status: 200, locals: nil, layout: "layout.html.slim")
|
152
|
+
unless [plain, html, json, erb, slim].compact.size == 1
|
153
|
+
raise ArgumentError, "provide exactly one render format"
|
154
|
+
end
|
147
155
|
|
148
|
-
|
149
|
-
|
156
|
+
if json
|
157
|
+
json = JSON.generate(json) unless json.is_a?(String)
|
158
|
+
return [status, { "content-type" => "application/json" }, [json]]
|
159
|
+
end
|
160
|
+
return [status, { "content-type" => "text/plain" }, [plain.to_s]] if plain
|
150
161
|
|
151
162
|
_define_locals(locals) if locals
|
152
163
|
template = "#{erb}.erb" if erb
|
@@ -154,39 +165,55 @@ class DeprecationCollector
|
|
154
165
|
html = render_template(template) if template
|
155
166
|
html = render_template(layout) { html } if layout
|
156
167
|
|
157
|
-
|
168
|
+
color_scheme_headers = {
|
169
|
+
"Accept-CH" => "Sec-CH-Prefers-Color-Scheme",
|
170
|
+
"Vary" => "Sec-CH-Prefers-Color-Scheme",
|
171
|
+
"Critical-CH" => "Sec-CH-Prefers-Color-Scheme"
|
172
|
+
}
|
173
|
+
|
174
|
+
return [status, { "content-type" => "text/html" }.merge(color_scheme_headers), [html.to_s]] if html
|
158
175
|
end
|
159
176
|
|
160
177
|
VIEW_PATH = "#{__dir__}/views"
|
161
178
|
|
162
179
|
def render_template(template, &block)
|
163
|
-
|
164
|
-
|
165
|
-
|
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
|
180
|
+
template_target = template.gsub(/\.slim\z/, ".template.rb")
|
181
|
+
template_method_name = "_template_#{template_target.gsub(/[^\w]/, "_")}"
|
182
|
+
template_filename = File.join(VIEW_PATH, template_target.to_s)
|
176
183
|
|
177
|
-
|
178
|
-
|
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
|
+
if ENV["DEPRECATION_COLLECTOR_RELOAD_WEB_TEMPLATES"]
|
185
|
+
_recompile_template(template, template_filename, template_method_name)
|
184
186
|
end
|
185
187
|
|
188
|
+
_load_template(template_filename, template_method_name) unless respond_to?(template_method_name)
|
189
|
+
|
186
190
|
send(template_method_name, &block)
|
187
191
|
end
|
188
192
|
|
189
193
|
private
|
194
|
+
|
195
|
+
def _load_template(template_filename, template_method_name)
|
196
|
+
src = File.read(template_filename)
|
197
|
+
src = ERB.new(src).src if template_filename.end_with?(".erb")
|
198
|
+
src = <<-RUBY
|
199
|
+
def #{template_method_name}; #{src}
|
200
|
+
end
|
201
|
+
RUBY
|
202
|
+
ActionContext.class_eval(src, template_filename.gsub(/\.template\.rb\z/, ".slim"), 1)
|
203
|
+
end
|
204
|
+
|
205
|
+
def _recompile_template(template, template_filename, template_method_name)
|
206
|
+
original_template_name = File.join(VIEW_PATH, template.to_s)
|
207
|
+
puts "Recompiling #{original_template_name}"
|
208
|
+
ActionContext.class_eval { undef_method(template_method_name) } if respond_to?(template_method_name)
|
209
|
+
|
210
|
+
if original_template_name.end_with?(".slim")
|
211
|
+
require "slim"
|
212
|
+
File.write(template_filename, Slim::Template.new(original_template_name).precompiled_template)
|
213
|
+
end
|
214
|
+
template_method_name
|
215
|
+
end
|
216
|
+
|
190
217
|
def _define_locals(locals)
|
191
218
|
locals&.each { |k, v| define_singleton_method(k) { v } unless singleton_methods.include?(k) }
|
192
219
|
end
|
@@ -1,13 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
|
2
3
|
begin
|
3
|
-
|
4
|
+
# this is stdgem in ruby 2.7+
|
5
|
+
require "cgi/escape"
|
4
6
|
rescue LoadError
|
7
|
+
# optional dependency not present
|
5
8
|
end
|
6
9
|
|
7
10
|
module Temple
|
8
11
|
# @api public
|
9
12
|
module Utils
|
10
|
-
extend self
|
13
|
+
extend self # rubocop:disable Style/ModuleFunction
|
11
14
|
|
12
15
|
# Returns an escaped copy of `html`.
|
13
16
|
# Strings which are declared as html_safe are not escaped.
|
@@ -31,11 +34,11 @@ module Temple
|
|
31
34
|
# Used by escape_html
|
32
35
|
# @api private
|
33
36
|
ESCAPE_HTML = {
|
34
|
-
|
35
|
-
'"'
|
36
|
-
'
|
37
|
-
|
38
|
-
|
37
|
+
"&" => "&",
|
38
|
+
'"' => """,
|
39
|
+
"'" => "'",
|
40
|
+
"<" => "<",
|
41
|
+
">" => ">"
|
39
42
|
}.freeze
|
40
43
|
|
41
44
|
ESCAPE_HTML_PATTERN = Regexp.union(*ESCAPE_HTML.keys)
|
@@ -0,0 +1,13 @@
|
|
1
|
+
_buf = ''; _buf << ("<header><h1>Import dump</h1></header><main><form".freeze);
|
2
|
+
;
|
3
|
+
;
|
4
|
+
;
|
5
|
+
; _slim_codeattributes1 = import_deprecations_path; if _slim_codeattributes1; if _slim_codeattributes1 == true; _buf << (" action=\"\"".freeze); else; _buf << (" action=\"".freeze); _buf << ((::Temple::Utils.escape_html((_slim_codeattributes1))).to_s); _buf << ("\"".freeze); end; end; _buf << (" enctype=\"multipart/form-data\" method=\"post\"><div class=\"mb-3\"><label class=\"form-label\" for=\"file\">Choose a JSON file to upload:</label> <input class=\"form-comtrol\" id=\"file\" name=\"file\" type=\"file\" /></div><div class=\"mb-3\"><button class=\"btn btn-primary\" type=\"submit\">Upload</button> <a class=\"btn btn-secondary\"".freeze);
|
6
|
+
;
|
7
|
+
;
|
8
|
+
;
|
9
|
+
;
|
10
|
+
;
|
11
|
+
; _slim_codeattributes2 = dump_deprecations_path; 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 << (">Dump</a> <a class=\"btn btn-secondary\"".freeze);
|
12
|
+
; _slim_codeattributes3 = 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 << (">Back</a> </div></form></main>".freeze);
|
13
|
+
; _buf
|
@@ -1,4 +1,4 @@
|
|
1
|
-
_buf = ''; _buf << ("<header><h1>Deprecations</h1><a class=\"btn btn-primary\" data-method=\"post\"".freeze);
|
1
|
+
_buf = ''; _buf << ("<header class=\"mb-3\"><h1>Deprecations</h1><a class=\"btn btn-primary\" data-method=\"post\"".freeze);
|
2
2
|
;
|
3
3
|
;
|
4
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);
|
@@ -25,67 +25,93 @@ _buf = ''; _buf << ("<header><h1>Deprecations</h1><a class=\"btn btn-primary\" d
|
|
25
25
|
;
|
26
26
|
;
|
27
27
|
; total = 0;
|
28
|
+
; by_realm = Hash.new(0);
|
28
29
|
; @deprecations.each do |deprecation|;
|
29
30
|
; total += 1;
|
31
|
+
; by_realm[deprecation[:realm]] += 1;
|
30
32
|
; _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
33
|
;
|
32
34
|
; _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
35
|
; _buf << ("</a><br />".freeze);
|
34
|
-
;
|
35
|
-
|
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);
|
36
|
+
; deprecation_tags(deprecation).each_pair do |tag, cls|;
|
37
|
+
; _buf << ("<div".freeze); _temple_html_attributeremover1 = ''; _temple_html_attributemerger1 = []; _temple_html_attributemerger1[0] = "badge"; _temple_html_attributemerger1[1] = ''; _slim_codeattributes7 = cls; if Array === _slim_codeattributes7; _slim_codeattributes7 = _slim_codeattributes7.flatten; _slim_codeattributes7.map!(&:to_s); _slim_codeattributes7.reject!(&:empty?); _temple_html_attributemerger1[1] << ((::Temple::Utils.escape_html((_slim_codeattributes7.join(" ")))).to_s); else; _temple_html_attributemerger1[1] << ((::Temple::Utils.escape_html((_slim_codeattributes7))).to_s); end; _temple_html_attributemerger1[1]; _temple_html_attributeremover1 << ((_temple_html_attributemerger1.reject(&:empty?).join(" ")).to_s); _temple_html_attributeremover1; if !_temple_html_attributeremover1.empty?; _buf << (" class=\"".freeze); _buf << ((_temple_html_attributeremover1).to_s); _buf << ("\"".freeze); end; _buf << (">".freeze); _buf << ((::Temple::Utils.escape_html((tag))).to_s);
|
44
38
|
;
|
45
39
|
; _buf << ("</div> ".freeze); end; _buf << ("</td><td>".freeze);
|
46
40
|
;
|
47
41
|
; msg = deprecation[:message]
|
48
42
|
delete_prefixes = Gem.path + [defined?(Rails) && Rails.root.to_s].compact
|
49
43
|
delete_prefixes.each { |path| msg.gsub!(path, '') }
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
44
|
+
msg.delete_prefix! deprecation[:gem_traceline].gsub(/:in .+/, ':') if deprecation[:gem_traceline]
|
45
|
+
msg.delete_prefix! deprecation[:app_traceline].gsub(/:in .+/, ':') if deprecation[:app_traceline]
|
46
|
+
msg.strip!
|
47
|
+
msg.delete_prefix!("DEPRECATION WARNING: ")
|
48
|
+
msg.delete_prefix!("warning: ")
|
49
|
+
;
|
50
|
+
; if msg.lines.size > 2;
|
51
|
+
; _buf << ("<pre class=\"pre-scrollable p-1\" style=\"overflow: auto; max-width: 700px; max-height: 200px; font-size: 11px\"><code>".freeze);
|
52
|
+
; _buf << ((::Temple::Utils.escape_html((msg))).to_s);
|
53
|
+
; _buf << ("</code></pre>".freeze); else;
|
54
|
+
; _buf << ("<div class=\"msg\">".freeze); _buf << ((::Temple::Utils.escape_html((msg))).to_s);
|
55
|
+
; _buf << ("</div>".freeze); end; if deprecation.dig(:notes, :comment);
|
55
56
|
; _buf << ((::Temple::Utils.escape_html((deprecation.dig(:notes, :comment)))).to_s);
|
56
57
|
;
|
57
58
|
; end; if deprecation.dig(:context, :action);
|
58
|
-
; _buf << ("<
|
59
|
-
; _buf << ("</
|
60
|
-
; _buf << ("<
|
61
|
-
;
|
59
|
+
; _buf << ("<i class=\"small controller\">".freeze); _buf << ((::Temple::Utils.escape_html((deprecation.dig(:context, :action)))).to_s);
|
60
|
+
; _buf << ("</i>".freeze); elsif deprecation.dig(:context, :params, :controller);
|
61
|
+
; _buf << ("<i class=\"small controller\">".freeze); _buf << ((::Temple::Utils.escape_html((deprecation.dig(:context, :params).slice(:controller, :action).values.join('#')))).to_s);
|
62
|
+
;
|
63
|
+
; _buf << ("</i>".freeze); end; _buf << ("</td><td class=\"small\">".freeze);
|
62
64
|
; if deprecation[:gem_traceline];
|
63
|
-
; _buf << (
|
64
|
-
;
|
65
|
-
;
|
65
|
+
; _buf << ("<div class=\"gem_location\">".freeze);
|
66
|
+
; location, function = deprecation[:gem_traceline].split(':in `', 2);
|
67
|
+
; full_gemname = location.delete_prefix('/gems/').gsub(%r{/.*}, '');
|
68
|
+
; location_in_gem = location.delete_prefix("/gems/#{full_gemname}/");
|
69
|
+
; _buf << ("<i>".freeze); _buf << ((::Temple::Utils.escape_html((full_gemname))).to_s);
|
70
|
+
; _buf << ("</i> <code class=\"code_location\"".freeze); _slim_codeattributes8 = location_in_gem; if _slim_codeattributes8; if _slim_codeattributes8 == true; _buf << (" data-copy-value=\"\"".freeze); else; _buf << (" data-copy-value=\"".freeze); _buf << ((::Temple::Utils.escape_html((_slim_codeattributes8))).to_s); _buf << ("\"".freeze); end; end; _buf << (">".freeze); _buf << ((::Temple::Utils.escape_html((location_in_gem.delete_prefix('lib/')))).to_s);
|
71
|
+
; _buf << ("</code> <i>".freeze); _buf << ((::Temple::Utils.escape_html((function.delete_suffix("'")))).to_s);
|
72
|
+
; _buf << ("</i></div>".freeze); end; if deprecation[:app_traceline];
|
73
|
+
; _buf << ("<div class=\"app_location\">".freeze);
|
66
74
|
; location, function = deprecation[:app_traceline].split(':in `', 2);
|
67
|
-
; _buf << ("<code class=\"code_location\"
|
68
|
-
; _buf << ("</code> ".freeze); _buf << ((::Temple::Utils.escape_html((function.delete_suffix("'")))).to_s);
|
69
|
-
; end; _buf << ("</td><td><div class=\"small ruby\">".freeze);
|
75
|
+
; _buf << ("<code class=\"code_location\">".freeze); _buf << ((::Temple::Utils.escape_html((location))).to_s);
|
76
|
+
; _buf << ("</code> <i>".freeze); _buf << ((::Temple::Utils.escape_html((function.delete_suffix("'")))).to_s);
|
77
|
+
; _buf << ("</i></div>".freeze); end; _buf << ("</td><td><div class=\"small ruby\">".freeze);
|
70
78
|
; _buf << ((::Temple::Utils.escape_html((deprecation[:ruby_version]))).to_s);
|
71
79
|
; _buf << ("</div><div class=\"small rails\">".freeze); _buf << ((::Temple::Utils.escape_html((deprecation[:rails_version]))).to_s);
|
72
80
|
;
|
73
|
-
; _buf << ("</div><a data-confirm=\"Delete?\" data-method=\"delete\"".freeze);
|
81
|
+
; _buf << ("</div><a data-confirm=\"Delete?\" data-method=\"delete\"".freeze); _slim_codeattributes9 = deprecation_path(deprecation[:digest]); 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\" title=\"Delete\"><i class=\"bi bi-trash\"></i></a></td></tr>".freeze);
|
74
82
|
;
|
75
83
|
; end; if total.zero?;
|
76
84
|
; _buf << ("<tr><td".freeze);
|
77
|
-
;
|
85
|
+
; _slim_codeattributes10 = 4; if _slim_codeattributes10; if _slim_codeattributes10 == true; _buf << (" colspan=\"\"".freeze); else; _buf << (" colspan=\"".freeze); _buf << ((::Temple::Utils.escape_html((_slim_codeattributes10))).to_s); _buf << ("\"".freeze); end; end; _buf << ("><p>Looks like there're no deprecations (or workers have not yet wrote to redis)</p><p>You can try <a data-method=\"post\"".freeze);
|
78
86
|
;
|
79
87
|
;
|
80
88
|
;
|
81
|
-
;
|
89
|
+
; _slim_codeattributes11 = deprecation_path(:trigger); if _slim_codeattributes11; if _slim_codeattributes11 == true; _buf << (" href=\"\"".freeze); else; _buf << (" href=\"".freeze); _buf << ((::Temple::Utils.escape_html((_slim_codeattributes11))).to_s); _buf << ("\"".freeze); end; end; _buf << (" rel=\"nofollow\">trigger a couple</a>".freeze);
|
90
|
+
; if import_enabled?;
|
91
|
+
; _buf << (", or <a".freeze);
|
92
|
+
; _slim_codeattributes12 = import_deprecations_path; if _slim_codeattributes12; if _slim_codeattributes12 == true; _buf << (" href=\"\"".freeze); else; _buf << (" href=\"".freeze); _buf << ((::Temple::Utils.escape_html((_slim_codeattributes12))).to_s); _buf << ("\"".freeze); end; end; _buf << (">import</a> ".freeze);
|
82
93
|
;
|
83
|
-
;
|
94
|
+
;
|
95
|
+
; end; _buf << ("</p></td></tr>".freeze); end; _buf << ("</table></main><footer>".freeze);
|
84
96
|
; if total > 3;
|
85
97
|
; _buf << ((::Temple::Utils.escape_html((total))).to_s);
|
86
98
|
; _buf << (" deprecations ".freeze);
|
99
|
+
; end; by_realm.each_pair do |realm, count|;
|
100
|
+
; _buf << ("<a class=\"btn btn-sm btn-outline-secondary\" href=\"?realm=".freeze); _buf << ((::Temple::Utils.escape_html((realm))).to_s); _buf << ("\">".freeze);
|
101
|
+
; _buf << ((::Temple::Utils.escape_html((realm))).to_s);
|
102
|
+
; _buf << (" <div".freeze); _temple_html_attributeremover2 = ''; _temple_html_attributemerger2 = []; _temple_html_attributemerger2[0] = "badge"; _temple_html_attributemerger2[1] = ''; _slim_codeattributes13 = (count == 0 ? 'bg-success' : 'bg-secondary'); if Array === _slim_codeattributes13; _slim_codeattributes13 = _slim_codeattributes13.flatten; _slim_codeattributes13.map!(&:to_s); _slim_codeattributes13.reject!(&:empty?); _temple_html_attributemerger2[1] << ((::Temple::Utils.escape_html((_slim_codeattributes13.join(" ")))).to_s); else; _temple_html_attributemerger2[1] << ((::Temple::Utils.escape_html((_slim_codeattributes13))).to_s); end; _temple_html_attributemerger2[1]; _temple_html_attributeremover2 << ((_temple_html_attributemerger2.reject(&:empty?).join(" ")).to_s); _temple_html_attributeremover2; if !_temple_html_attributeremover2.empty?; _buf << (" class=\"".freeze); _buf << ((_temple_html_attributeremover2).to_s); _buf << ("\"".freeze); end; _buf << (">".freeze); _buf << ((::Temple::Utils.escape_html((count))).to_s);
|
103
|
+
; _buf << ("</div> </a> ".freeze); end; if params[:realm] && params[:realm] != '';
|
104
|
+
; _buf << ("<a class=\"btn btn-sm btn-outline-primary\" href=\"?realm=\">Other realms </a> ".freeze);
|
105
|
+
;
|
106
|
+
;
|
107
|
+
; end; _buf << ("</footer><style>.code_location {\n cursor: pointer;\n}</style><script>document.querySelectorAll('.code_location').forEach(function(elem){\n elem.addEventListener('click', function () {\n let textToCopy = elem.getAttribute('data-copy-value');\n if(!textToCopy) textToCopy = elem.innerText;\n console.log(\"Copying\", textToCopy)\n navigator.clipboard.writeText(textToCopy);\n }, false);\n});</script>".freeze);
|
108
|
+
;
|
109
|
+
;
|
110
|
+
;
|
111
|
+
;
|
112
|
+
;
|
113
|
+
;
|
87
114
|
;
|
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
115
|
;
|
90
116
|
;
|
91
117
|
;
|
@@ -1,11 +1,11 @@
|
|
1
|
-
_buf = ''; _buf << ("<!DOCTYPE html><html
|
2
|
-
;
|
1
|
+
_buf = ''; _buf << ("<!DOCTYPE html><html".freeze);
|
2
|
+
; _slim_codeattributes1 = current_color_theme; if _slim_codeattributes1; if _slim_codeattributes1 == true; _buf << (" data-bs-theme=\"\"".freeze); else; _buf << (" data-bs-theme=\"".freeze); _buf << ((::Temple::Utils.escape_html((_slim_codeattributes1))).to_s); _buf << ("\"".freeze); end; end; _buf << (" lang=\"en\"><head><meta charset=\"utf-8\" /><meta content=\"IE=edge;chrome=1\" http-equiv=\"X-UA-Compatible\" /><title>".freeze);
|
3
3
|
;
|
4
4
|
;
|
5
5
|
;
|
6
6
|
;
|
7
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.
|
8
|
+
; _buf << ("</title><meta content=\"Deprecation collector ui\" name=\"description\" /><meta content=\"width=device-width\" name=\"viewport\" /><link crossorigin=\"anonymous\" href=\"https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha3/dist/css/bootstrap.min.css\" integrity=\"sha256-Fu5/PVNGJlC70y4mPEjA6nWVdPz2IMaBrXGQCJEsRho= sha384-KK94CHFLLe+nY2dmCWGMq91rCGa5gtU4mk92HdvYe+M/SXH301p5ILy+dN9+nJOZ\" rel=\"stylesheet\" /><link crossorigin=\"anonymous\" href=\"https://cdn.jsdelivr.net/npm/bootstrap-icons@1.10.2/font/bootstrap-icons.css\" integrity=\"sha256-4RctOgogjPAdwGbwq+rxfwAmSpZhWaafcZR9btzUk18= sha384-b6lVK+yci+bfDmaY1u0zE8YYJt0TZxLEAFyYSLHId4xoVvsrQu3INevFKo+Xir8e\" rel=\"stylesheet\" /></head><body><div class=\"container-fluid\">".freeze);
|
9
9
|
;
|
10
10
|
;
|
11
11
|
;
|
@@ -14,5 +14,78 @@ _buf = ''; _buf << ("<!DOCTYPE html><html><head><meta charset=\"utf-8\" /><meta
|
|
14
14
|
;
|
15
15
|
; _buf << ((yield).to_s);
|
16
16
|
;
|
17
|
-
; _buf << ("</div><script src=\"https://cdn.jsdelivr.net/npm/
|
17
|
+
; _buf << ("</div><script async=\"\" crossorigin=\"anonymous\" integrity=\"sha256-9Mbe9mGA7d+AJbnz0O6CoLGabCbe6JAYnGshvGIADiE=\" src=\"https://cdn.jsdelivr.net/npm/@rails/ujs@7.0.4-3/lib/assets/compiled/rails-ujs.js\"></script><script async=\"\" crossorigin=\"anonymous\" integrity=\"sha256-QucgBAKNM4KKPJHqTfH8e+JON1G/gmPPqtMmBb+wHpc= sha384-Y4oOpwW3duJdCWv5ly8SCFYWqFDsfob/3GkgExXKV4idmbt98QcxXYs9UoXAB7BZ\" src=\"https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha3/dist/js/bootstrap.min.js\"></script><script>(() => {\n 'use strict'\n\n const storedTheme = localStorage.getItem('theme')\n\n const getPreferredTheme = () => {\n if (storedTheme) { return storedTheme }\n let fromServer = document.documentElement.getAttribute('data-bs-theme')\n if(fromServer) { return fromServer }\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'\n }\n\n const setTheme = function (theme) {\n if (theme === 'auto' && window.matchMedia('(prefers-color-scheme: dark)').matches) {\n document.documentElement.setAttribute('data-bs-theme', 'dark')\n } else {\n document.documentElement.setAttribute('data-bs-theme', theme)\n }\n }\n\n setTheme(getPreferredTheme())\n\n const showActiveTheme = (theme, focus = false) => {\n const themeSwitcher = document.querySelector('#bd-theme')\n\n if (!themeSwitcher) {\n return\n }\n\n const themeSwitcherText = document.querySelector('#bd-theme-text')\n const activeThemeIcon = document.querySelector('.theme-icon-active use')\n const btnToActive = document.querySelector(`[data-bs-theme-value=\"${theme}\"]`)\n const svgOfActiveBtn = btnToActive.querySelector('svg use').getAttribute('href')\n\n document.querySelectorAll('[data-bs-theme-value]').forEach(element => {\n element.classList.remove('active')\n element.setAttribute('aria-pressed', 'false')\n })\n\n btnToActive.classList.add('active')\n btnToActive.setAttribute('aria-pressed', 'true')\n activeThemeIcon.setAttribute('href', svgOfActiveBtn)\n const themeSwitcherLabel = `${themeSwitcherText.textContent} (${btnToActive.dataset.bsThemeValue})`\n themeSwitcher.setAttribute('aria-label', themeSwitcherLabel)\n\n if (focus) {\n themeSwitcher.focus()\n }\n }\n\n window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => {\n if (storedTheme !== 'light' || storedTheme !== 'dark') {\n setTheme(getPreferredTheme())\n }\n })\n\n window.addEventListener('DOMContentLoaded', () => {\n showActiveTheme(getPreferredTheme())\n\n document.querySelectorAll('[data-bs-theme-value]')\n .forEach(toggle => {\n toggle.addEventListener('click', () => {\n const theme = toggle.getAttribute('data-bs-theme-value')\n localStorage.setItem('theme', theme)\n setTheme(theme)\n showActiveTheme(theme, true)\n })\n })\n })\n})()</script></body></html>".freeze);
|
18
|
+
;
|
19
|
+
;
|
20
|
+
;
|
21
|
+
;
|
22
|
+
;
|
23
|
+
;
|
24
|
+
;
|
25
|
+
;
|
26
|
+
;
|
27
|
+
;
|
28
|
+
;
|
29
|
+
;
|
30
|
+
;
|
31
|
+
;
|
32
|
+
;
|
33
|
+
;
|
34
|
+
;
|
35
|
+
;
|
36
|
+
;
|
37
|
+
;
|
38
|
+
;
|
39
|
+
;
|
40
|
+
;
|
41
|
+
;
|
42
|
+
;
|
43
|
+
;
|
44
|
+
;
|
45
|
+
;
|
46
|
+
;
|
47
|
+
;
|
48
|
+
;
|
49
|
+
;
|
50
|
+
;
|
51
|
+
;
|
52
|
+
;
|
53
|
+
;
|
54
|
+
;
|
55
|
+
;
|
56
|
+
;
|
57
|
+
;
|
58
|
+
;
|
59
|
+
;
|
60
|
+
;
|
61
|
+
;
|
62
|
+
;
|
63
|
+
;
|
64
|
+
;
|
65
|
+
;
|
66
|
+
;
|
67
|
+
;
|
68
|
+
;
|
69
|
+
;
|
70
|
+
;
|
71
|
+
;
|
72
|
+
;
|
73
|
+
;
|
74
|
+
;
|
75
|
+
;
|
76
|
+
;
|
77
|
+
;
|
78
|
+
;
|
79
|
+
;
|
80
|
+
;
|
81
|
+
;
|
82
|
+
;
|
83
|
+
;
|
84
|
+
;
|
85
|
+
;
|
86
|
+
;
|
87
|
+
;
|
88
|
+
;
|
89
|
+
;
|
90
|
+
;
|
18
91
|
; _buf
|