deprecation_collector 0.4.0 → 0.5.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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, '/', &block)
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, application=nil)
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) do
60
- action.call(env, application)
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,7 @@ class DeprecationCollector
116
120
  @block = block
117
121
  end
118
122
 
119
- def call(env, application)
123
+ def call(_env, application)
120
124
  @web = application.web
121
125
  instance_exec(&@block)
122
126
  end
@@ -130,27 +134,30 @@ class DeprecationCollector
130
134
  end
131
135
 
132
136
  def params
133
- @params ||= Hash.new { |hash, key| hash[key.to_s] if Symbol === key }
134
- .merge!(request.params)
135
- .merge!(route_params.transform_keys(&:to_s))
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))
136
140
  end
137
141
 
138
- def halt(res, content=nil)
139
- throw :halt, [res, {"content-type" => "text/plain"}, [content || res.to_s]]
142
+ def halt(res, content = nil)
143
+ throw :halt, [res, { "content-type" => "text/plain" }, [content || res.to_s]]
140
144
  end
141
145
 
142
146
  def redirect_to(location)
143
- throw :halt, [302, {"location" => "#{request.base_url}#{location}"}, []]
147
+ throw :halt, [302, { "location" => "#{request.base_url}#{location}" }, []]
144
148
  end
145
149
 
146
- def render(plain: nil, html: nil, json: nil, erb: nil, slim: nil, status: 200, locals: nil, layout: 'layout.html.slim')
147
- raise ArgumentError, "provide exactly one render format" unless [plain, html, json, erb, slim].compact.size == 1
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
148
155
 
149
156
  if json
150
157
  json = JSON.generate(json) unless json.is_a?(String)
151
- return [status, {"content-type" => "application/json"}, [json]]
158
+ return [status, { "content-type" => "application/json" }, [json]]
152
159
  end
153
- return [status, {"content-type" => "text/plain"}, [plain.to_s]] if plain
160
+ return [status, { "content-type" => "text/plain" }, [plain.to_s]] if plain
154
161
 
155
162
  _define_locals(locals) if locals
156
163
  template = "#{erb}.erb" if erb
@@ -159,44 +166,54 @@ class DeprecationCollector
159
166
  html = render_template(layout) { html } if layout
160
167
 
161
168
  color_scheme_headers = {
162
- 'Accept-CH' => 'Sec-CH-Prefers-Color-Scheme',
163
- 'Vary' => 'Sec-CH-Prefers-Color-Scheme',
164
- 'Critical-CH' => 'Sec-CH-Prefers-Color-Scheme'
169
+ "Accept-CH" => "Sec-CH-Prefers-Color-Scheme",
170
+ "Vary" => "Sec-CH-Prefers-Color-Scheme",
171
+ "Critical-CH" => "Sec-CH-Prefers-Color-Scheme"
165
172
  }
166
173
 
167
- return [status, {"content-type" => "text/html"}.merge(color_scheme_headers), [html.to_s]] if html
174
+ return [status, { "content-type" => "text/html" }.merge(color_scheme_headers), [html.to_s]] if html
168
175
  end
169
176
 
170
177
  VIEW_PATH = "#{__dir__}/views"
171
178
 
172
179
  def render_template(template, &block)
173
- original_template_name = File.join(VIEW_PATH, template.to_s)
174
- template = template.gsub(/\.slim\z/, '.template.rb')
175
- template_method_name = "_template_#{template.gsub(/[^\w]/, '_')}"
176
- template_filename = File.join(VIEW_PATH, template.to_s)
177
-
178
- if ENV['DEPRECATION_COLLECTOR_RELOAD_WEB_TEMPLATES']
179
- require 'slim'
180
- puts "Recompiling #{original_template_name}"
181
- ActionContext.class_eval { undef_method(template_method_name) } if respond_to?(template_method_name)
182
- if original_template_name.end_with?('.slim')
183
- File.write(template_filename, Slim::Template.new(original_template_name).precompiled_template)
184
- end
185
- 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)
186
183
 
187
- unless respond_to?(template_method_name)
188
- src = File.read(template_filename)
189
- src = ERB.new(src).src if template_filename.end_with?('.erb')
190
- ActionContext.class_eval <<-RUBY, template_filename.gsub(/\.template\.rb\z/, '.slim'), 1
191
- def #{template_method_name}; #{src}
192
- end
193
- RUBY
184
+ if ENV["DEPRECATION_COLLECTOR_RELOAD_WEB_TEMPLATES"]
185
+ _recompile_template(template, template_filename, template_method_name)
194
186
  end
195
187
 
188
+ _load_template(template_filename, template_method_name) unless respond_to?(template_method_name)
189
+
196
190
  send(template_method_name, &block)
197
191
  end
198
192
 
199
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
+
200
217
  def _define_locals(locals)
201
218
  locals&.each { |k, v| define_singleton_method(k) { v } unless singleton_methods.include?(k) }
202
219
  end
@@ -1,13 +1,16 @@
1
+ # frozen_string_literal: true
1
2
 
2
3
  begin
3
- require 'cgi/escape'
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
- '&' => '&amp;',
35
- '"' => '&quot;',
36
- '\'' => '&#39;',
37
- '<' => '&lt;',
38
- '>' => '&gt;'
37
+ "&" => "&amp;",
38
+ '"' => "&quot;",
39
+ "'" => "&#39;",
40
+ "<" => "&lt;",
41
+ ">" => "&gt;"
39
42
  }.freeze
40
43
 
41
44
  ESCAPE_HTML_PATTERN = Regexp.union(*ESCAPE_HTML.keys)
@@ -6,7 +6,8 @@ _buf = ''; _buf << ("<header class=\"mb-3\"><h1>Deprecations</h1><a class=\"btn
6
6
  ;
7
7
  ;
8
8
  ;
9
- ; if DeprecationCollector.instance.enabled_in_redis?;
9
+ ; if DeprecationCollector.instance.storage.support_disabling?;
10
+ ; if DeprecationCollector.instance.storage.enabled?;
10
11
  ;
11
12
  ;
12
13
  ;
@@ -16,7 +17,7 @@ _buf = ''; _buf << ("<header class=\"mb-3\"><h1>Deprecations</h1><a class=\"btn
16
17
  ;
17
18
  ; _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
  ;
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
+ ; end; 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
  ;
21
22
  ;
22
23
  ;
@@ -25,8 +26,10 @@ _buf = ''; _buf << ("<header class=\"mb-3\"><h1>Deprecations</h1><a class=\"btn
25
26
  ;
26
27
  ;
27
28
  ; total = 0;
29
+ ; by_realm = Hash.new(0);
28
30
  ; @deprecations.each do |deprecation|;
29
31
  ; total += 1;
32
+ ; by_realm[deprecation[:realm]] += 1;
30
33
  ; _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
34
  ;
32
35
  ; _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);
@@ -49,16 +52,16 @@ msg.delete_prefix!("warning: ")
49
52
  ; _buf << ("<pre class=\"pre-scrollable p-1\" style=\"overflow: auto; max-width: 700px; max-height: 200px; font-size: 11px\"><code>".freeze);
50
53
  ; _buf << ((::Temple::Utils.escape_html((msg))).to_s);
51
54
  ; _buf << ("</code></pre>".freeze); else;
52
- ; _buf << ("<div class=\"small\">".freeze); _buf << ((::Temple::Utils.escape_html((msg))).to_s);
55
+ ; _buf << ("<div class=\"msg\">".freeze); _buf << ((::Temple::Utils.escape_html((msg))).to_s);
53
56
  ; _buf << ("</div>".freeze); end; if deprecation.dig(:notes, :comment);
54
57
  ; _buf << ((::Temple::Utils.escape_html((deprecation.dig(:notes, :comment)))).to_s);
55
58
  ;
56
59
  ; end; if deprecation.dig(:context, :action);
57
- ; _buf << ("<div class=\"small controller\">".freeze); _buf << ((::Temple::Utils.escape_html((deprecation.dig(:context, :action)))).to_s);
58
- ; _buf << ("</div>".freeze); elsif deprecation.dig(:context, :params, :controller);
59
- ; _buf << ("<div class=\"small controller\">".freeze); _buf << ((::Temple::Utils.escape_html((deprecation.dig(:context, :params).slice(:controller, :action).values.join('#')))).to_s);
60
+ ; _buf << ("<i class=\"small controller\">".freeze); _buf << ((::Temple::Utils.escape_html((deprecation.dig(:context, :action)))).to_s);
61
+ ; _buf << ("</i>".freeze); elsif deprecation.dig(:context, :params, :controller);
62
+ ; _buf << ("<i class=\"small controller\">".freeze); _buf << ((::Temple::Utils.escape_html((deprecation.dig(:context, :params).slice(:controller, :action).values.join('#')))).to_s);
60
63
  ;
61
- ; _buf << ("</div>".freeze); end; _buf << ("</td><td class=\"small\">".freeze);
64
+ ; _buf << ("</i>".freeze); end; _buf << ("</td><td class=\"small\">".freeze);
62
65
  ; if deprecation[:gem_traceline];
63
66
  ; _buf << ("<div class=\"gem_location\">".freeze);
64
67
  ; location, function = deprecation[:gem_traceline].split(':in `', 2);
@@ -94,6 +97,14 @@ msg.delete_prefix!("warning: ")
94
97
  ; if total > 3;
95
98
  ; _buf << ((::Temple::Utils.escape_html((total))).to_s);
96
99
  ; _buf << (" deprecations ".freeze);
100
+ ; end; by_realm.each_pair do |realm, count|;
101
+ ; _buf << ("<a class=\"btn btn-sm btn-outline-secondary\" href=\"?realm=".freeze); _buf << ((::Temple::Utils.escape_html((realm))).to_s); _buf << ("\">".freeze);
102
+ ; _buf << ((::Temple::Utils.escape_html((realm))).to_s);
103
+ ; _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);
104
+ ; _buf << ("</div> </a> ".freeze); end; if params[:realm] && params[:realm] != '';
105
+ ; _buf << ("<a class=\"btn btn-sm btn-outline-primary\" href=\"?realm=\">Other realms </a> ".freeze);
106
+ ;
107
+ ;
97
108
  ; 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);
98
109
  ;
99
110
  ;
@@ -2,12 +2,81 @@ _buf = ''; _buf << ("<header class=\"mb-3\"><h1>Deprecation</h1><a class=\"btn b
2
2
  ;
3
3
  ;
4
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 p-3\"><pre><code>".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><dl class=\"row\"><dt>Message</dt><dd><code>".freeze);
6
6
  ;
7
7
  ;
8
8
  ;
9
9
  ;
10
10
  ;
11
11
  ;
12
- ; _buf << ((::Temple::Utils.escape_html((@deprecation.pretty_inspect))).to_s);
13
- ; _buf << ("</code></pre></div></main>".freeze); _buf
12
+ ;
13
+ ; _buf << ((::Temple::Utils.escape_html((@deprecation[:message]))).to_s);
14
+ ; _buf << ("</code></dd><dt>First time</dt><dd>".freeze);
15
+ ;
16
+ ;
17
+ ; _buf << ((::Temple::Utils.escape_html((@deprecation[:first_timestamp]&.yield_self { |time| Time.at(time) }))).to_s);
18
+ ;
19
+ ; _buf << ("</dd>".freeze); if @deprecation[:count] > 1;
20
+ ; _buf << ("<dt>Count</dt><dd>".freeze);
21
+ ; _buf << ((::Temple::Utils.escape_html((@deprecation[:count]))).to_s);
22
+ ;
23
+ ; _buf << ("</dd>".freeze); end; _buf << ("<dt>Realm</dt><dd>".freeze);
24
+ ; _buf << ((::Temple::Utils.escape_html((@deprecation[:realm]))).to_s);
25
+ ;
26
+ ; _buf << ("</dd>".freeze); if @deprecation[:ruby_version];
27
+ ; _buf << ("<dt>Ruby</dt><dd>".freeze);
28
+ ; _buf << ((::Temple::Utils.escape_html((@deprecation[:ruby_version]))).to_s);
29
+ ; _buf << ("</dd>".freeze); end; if @deprecation[:rails_version];
30
+ ; _buf << ("<dt>Rails</dt><dd>".freeze);
31
+ ; _buf << ((::Temple::Utils.escape_html((@deprecation[:rails_version]))).to_s);
32
+ ;
33
+ ; _buf << ("</dd>".freeze); end; if @deprecation[:revision];
34
+ ; _buf << ("<dt>Revision</dt><dd>".freeze);
35
+ ; _buf << ((::Temple::Utils.escape_html((@deprecation[:revision]))).to_s);
36
+ ; _buf << ("</dd>".freeze); end; if @deprecation[:hostname];
37
+ ; _buf << ("<dt>Hostname</dt><dd>".freeze);
38
+ ; _buf << ((::Temple::Utils.escape_html((@deprecation[:hostname]))).to_s);
39
+ ;
40
+ ; _buf << ("</dd>".freeze); end; if @deprecation[:context];
41
+ ; _buf << ("<dt>Context</dt><dd><div class=\"card p-3\"><pre><code>".freeze);
42
+ ;
43
+ ;
44
+ ;
45
+ ; _buf << ((::Temple::Utils.escape_html((JSON.pretty_generate(@deprecation[:context])))).to_s);
46
+ ;
47
+ ; _buf << ("</code></pre></div></dd>".freeze); end; if @deprecation[:app_traceline];
48
+ ; _buf << ("<dt>App traceline</dt><dd>".freeze);
49
+ ;
50
+ ; location, function = @deprecation[:app_traceline].split(':in `', 2);
51
+ ; _buf << ("<code class=\"code_location\">".freeze); _buf << ((::Temple::Utils.escape_html((location))).to_s);
52
+ ; _buf << ("</code> <i>".freeze); _buf << ((::Temple::Utils.escape_html((function.delete_suffix("'")))).to_s);
53
+ ;
54
+ ; _buf << ("</i></dd>".freeze); end; if @deprecation[:gem_traceline];
55
+ ; _buf << ("<dt>Gem traceline</dt><dd>".freeze);
56
+ ;
57
+ ; location, function = @deprecation[:gem_traceline].split(':in `', 2);
58
+ ; full_gemname = location.delete_prefix('/gems/').gsub(%r{/.*}, '');
59
+ ; location_in_gem = location.delete_prefix("/gems/#{full_gemname}/");
60
+ ; _buf << ("<i>".freeze); _buf << ((::Temple::Utils.escape_html((full_gemname))).to_s);
61
+ ; _buf << ("</i> <code class=\"code_location\"".freeze); _slim_codeattributes3 = location_in_gem; if _slim_codeattributes3; if _slim_codeattributes3 == true; _buf << (" data-copy-value=\"\"".freeze); else; _buf << (" data-copy-value=\"".freeze); _buf << ((::Temple::Utils.escape_html((_slim_codeattributes3))).to_s); _buf << ("\"".freeze); end; end; _buf << (">".freeze); _buf << ((::Temple::Utils.escape_html((location_in_gem.delete_prefix('lib/')))).to_s);
62
+ ; _buf << ("</code> <i>".freeze); _buf << ((::Temple::Utils.escape_html((function.delete_suffix("'")))).to_s);
63
+ ;
64
+ ; _buf << ("</i></dd>".freeze); end; if @deprecation[:full_backtrace];
65
+ ; _buf << ("<dt>Backtrace</dt><dd>".freeze);
66
+ ;
67
+ ; @deprecation[:full_backtrace].each do |trace_line|;
68
+ ; _buf << ("<div class=\"trace-line\">".freeze);
69
+ ; location, function = trace_line.split(':in `', 2);
70
+ ; _buf << ("<code class=\"code_location\">".freeze); _buf << ((::Temple::Utils.escape_html((location))).to_s);
71
+ ; _buf << ("</code> <i>".freeze); _buf << ((::Temple::Utils.escape_html((function.delete_suffix("'")))).to_s);
72
+ ;
73
+ ; _buf << ("</i></div>".freeze); end; _buf << ("</dd>".freeze); end; fields_to_reject = %i[message first_timestamp count realm app_traceline gem_traceline full_backtrace ruby_version rails_version context revision hostname digest_base digest].to_set;
74
+ ; additional_data = @deprecation.reject { |key,_val| fields_to_reject.include?(key) };
75
+ ; if additional_data.size > 0;
76
+ ; _buf << ("<dt>Additional data <div class=\"card p-3\"><pre><code>".freeze);
77
+ ;
78
+ ;
79
+ ;
80
+ ; _buf << ((::Temple::Utils.escape_html((JSON.pretty_generate additional_data))).to_s);
81
+ ; _buf << ("</code></pre></div></dt>".freeze); end; _buf << ("</dl><a".freeze); _slim_codeattributes4 = deprecation_path(params[:id], format: 'json'); 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 << (">Raw json</a></main>".freeze);
82
+ ; _buf
@@ -4,9 +4,10 @@ require "erb"
4
4
  require "rack/content_length"
5
5
  require "rack/builder"
6
6
 
7
- require_relative 'web/application'
7
+ require_relative "web/application"
8
8
 
9
9
  class DeprecationCollector
10
+ # rack app with a html interface to deprecation collector with a persistent storage like redis
10
11
  class Web
11
12
  attr_accessor :import_enabled
12
13
 
@@ -28,6 +29,7 @@ class DeprecationCollector
28
29
  end
29
30
 
30
31
  private
32
+
31
33
  def build
32
34
  web = self
33
35
  ::Rack::Builder.new do