logster 2.6.2 → 2.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +2 -1
  3. data/.travis.yml +0 -1
  4. data/CHANGELOG.md +23 -0
  5. data/README.md +14 -2
  6. data/assets/javascript/client-app.js +199 -164
  7. data/assets/javascript/vendor.js +3535 -4774
  8. data/assets/stylesheets/client-app.css +1 -1
  9. data/assets/stylesheets/vendor.css +1 -4
  10. data/build_client_app.sh +1 -1
  11. data/client-app/.eslintignore +0 -2
  12. data/client-app/.gitignore +0 -2
  13. data/client-app/app/components/message-info.js +11 -4
  14. data/client-app/app/controllers/index.js +5 -0
  15. data/client-app/app/lib/utilities.js +3 -1
  16. data/client-app/app/models/group.js +5 -1
  17. data/client-app/app/models/message.js +26 -5
  18. data/client-app/app/styles/app.css +20 -13
  19. data/client-app/app/templates/components/actions-menu.hbs +3 -3
  20. data/client-app/app/templates/components/back-trace.hbs +1 -1
  21. data/client-app/app/templates/components/message-info.hbs +1 -1
  22. data/client-app/app/templates/components/message-row.hbs +2 -2
  23. data/client-app/app/templates/components/page-nav.hbs +4 -4
  24. data/client-app/app/templates/components/patterns-list.hbs +4 -4
  25. data/client-app/app/templates/index.hbs +5 -5
  26. data/client-app/config/icons.js +26 -0
  27. data/client-app/package-lock.json +2160 -1933
  28. data/client-app/package.json +9 -8
  29. data/client-app/tests/integration/components/back-trace-test.js +1 -1
  30. data/client-app/tests/integration/components/env-tab-test.js +2 -2
  31. data/lib/logster/base_store.rb +8 -1
  32. data/lib/logster/configuration.rb +3 -1
  33. data/lib/logster/message.rb +2 -18
  34. data/lib/logster/middleware/reporter.rb +8 -1
  35. data/lib/logster/middleware/viewer.rb +8 -8
  36. data/lib/logster/redis_store.rb +22 -6
  37. data/lib/logster/version.rb +1 -1
  38. data/logster.gemspec +4 -5
  39. data/test/logster/middleware/test_reporter.rb +23 -0
  40. data/test/logster/test_base_store.rb +26 -0
  41. data/test/logster/test_group.rb +1 -1
  42. data/test/logster/test_message.rb +1 -7
  43. metadata +10 -29
  44. data/assets/fonts/FontAwesome.otf +0 -0
  45. data/assets/fonts/fontawesome-webfont.eot +0 -0
  46. data/assets/fonts/fontawesome-webfont.svg +0 -640
  47. data/assets/fonts/fontawesome-webfont.ttf +0 -0
  48. data/assets/fonts/fontawesome-webfont.woff +0 -0
  49. data/assets/fonts/fontawesome-webfont.woff2 +0 -0
@@ -19,30 +19,31 @@
19
19
  },
20
20
  "devDependencies": {
21
21
  "@ember/optional-features": "^1.1.0",
22
+ "@fortawesome/ember-fontawesome": "^0.2.1",
23
+ "@fortawesome/free-brands-svg-icons": "^5.13.0",
24
+ "@fortawesome/free-regular-svg-icons": "^5.13.0",
25
+ "@fortawesome/free-solid-svg-icons": "^5.13.0",
22
26
  "@glimmer/component": "^1.0.0",
23
- "babel-eslint": "^10.0.3",
27
+ "babel-eslint": "^10.1.0",
24
28
  "broccoli-asset-rev": "^3.0.0",
25
29
  "ember-auto-import": "^1.5.3",
26
30
  "ember-cli": "^3.15.0",
27
31
  "ember-cli-app-version": "^3.2.0",
28
- "ember-cli-babel": "^7.13.0",
32
+ "ember-cli-babel": "^7.19.0",
29
33
  "ember-cli-dependency-checker": "^3.2.0",
30
34
  "ember-cli-eslint": "^5.1.0",
31
- "ember-cli-htmlbars": "^4.2.0",
35
+ "ember-cli-htmlbars": "^4.3.1",
32
36
  "ember-cli-inject-live-reload": "^2.0.1",
33
37
  "ember-cli-sri": "^2.1.1",
34
- "ember-cli-template-lint": "^1.0.0-beta.3",
38
+ "ember-cli-template-lint": "^1.0.0",
35
39
  "ember-cli-uglify": "^3.0.0",
36
- "ember-data": "~3.15.0",
37
40
  "ember-export-application-global": "^2.0.1",
38
- "ember-fetch": "^7.0.0",
39
- "ember-font-awesome": "^4.0.0-rc.4",
40
41
  "ember-load-initializers": "^2.1.1",
41
42
  "ember-maybe-import-regenerator": "^0.1.6",
42
43
  "ember-qunit": "^4.6.0",
43
44
  "ember-resolver": "^7.0.0",
44
45
  "ember-source": "^3.15.0",
45
- "eslint-plugin-ember": "^7.7.1",
46
+ "eslint-plugin-ember": "^7.13.0",
46
47
  "eslint-plugin-node": "^10.0.0",
47
48
  "loader.js": "^4.7.0",
48
49
  "prettier": "^1.19.1",
@@ -46,7 +46,7 @@ activerecord-6.0.1/lib/active_record/relation/finder_methods.rb:317:in \`exists?
46
46
 
47
47
  let gemLine = find("div.backtrace-line");
48
48
  assert.equal(
49
- gemLine.textContent,
49
+ gemLine.textContent.trim(),
50
50
  "activerecord-6.0.1/lib/active_record/relation/finder_methods.rb:317:in `exists?'",
51
51
  "gem lines are truncated"
52
52
  );
@@ -148,7 +148,7 @@ module("Integration | Component | env-tab", function(hooks) {
148
148
 
149
149
  assert.equal(
150
150
  defaultExpanded.children[1].textContent.trim(),
151
- "[vvv1, vvv2]",
151
+ "vvv1, [vvv2]",
152
152
  "list is expanded by default when its length is 3 or less"
153
153
  );
154
154
 
@@ -165,7 +165,7 @@ module("Integration | Component | env-tab", function(hooks) {
165
165
  const expanded = find(".env-table tr");
166
166
  assert.equal(
167
167
  expanded.children[1].textContent.trim(),
168
- "[value1, value2, value3, value4]",
168
+ "value1, [value2, value3, value4]",
169
169
  "expanded env keys shown correctly"
170
170
  );
171
171
 
@@ -152,9 +152,11 @@ module Logster
152
152
  return if (!msg || (String === msg && msg.empty?)) && skip_empty
153
153
  return if level && severity < level
154
154
 
155
+ msg = msg.inspect unless String === msg
156
+ msg = truncate_message(msg)
155
157
  message = Logster::Message.new(severity, progname, msg, opts[:timestamp], count: opts[:count])
156
158
 
157
- env = opts[:env] || {}
159
+ env = opts[:env]&.dup || {}
158
160
  backtrace = opts[:backtrace]
159
161
  if Hash === env && env[:backtrace]
160
162
  # Special - passing backtrace through env
@@ -245,6 +247,11 @@ module Logster
245
247
 
246
248
  private
247
249
 
250
+ def truncate_message(msg)
251
+ cap = Logster.config.maximum_message_length
252
+ msg.size <= cap ? msg : msg[0...cap] + "..."
253
+ end
254
+
248
255
  def not_implemented
249
256
  raise "Not Implemented"
250
257
  end
@@ -17,7 +17,8 @@ module Logster
17
17
  :enable_backtrace_links,
18
18
  :gems_dir,
19
19
  :max_env_bytes,
20
- :max_env_count_per_message
20
+ :max_env_count_per_message,
21
+ :maximum_message_length
21
22
  )
22
23
 
23
24
  attr_writer :subdirectory
@@ -37,6 +38,7 @@ module Logster
37
38
  @project_directories = []
38
39
  @enable_backtrace_links = true
39
40
  @gems_dir = Gem.dir + "/gems/"
41
+ @maximum_message_length = 2000
40
42
 
41
43
  @allow_grouping = false
42
44
 
@@ -4,8 +4,6 @@ require 'digest/sha1'
4
4
  require 'securerandom'
5
5
 
6
6
  module Logster
7
- MAX_MESSAGE_LENGTH = 600
8
-
9
7
  class Message
10
8
  LOGSTER_ENV = "_logster_env".freeze
11
9
  ALLOWED_ENV = %w{
@@ -30,7 +28,7 @@ module Logster
30
28
  @timestamp = timestamp || get_timestamp
31
29
  @severity = severity
32
30
  @progname = progname
33
- @message = truncate_message(message)
31
+ @message = message
34
32
  @key = key || SecureRandom.hex
35
33
  @backtrace = nil
36
34
  @count = count || 1
@@ -57,10 +55,6 @@ module Logster
57
55
  h
58
56
  end
59
57
 
60
- def message=(m)
61
- @message = truncate_message(m)
62
- end
63
-
64
58
  def to_json(opts = nil)
65
59
  exclude_env = Hash === opts && opts.delete(:exclude_env)
66
60
  JSON.fast_generate(to_h(exclude_env: exclude_env), opts)
@@ -143,10 +137,6 @@ module Logster
143
137
  end
144
138
  end
145
139
 
146
- def is_similar?(other)
147
- self.grouping_key == other.grouping_key
148
- end
149
-
150
140
  def merge_similar_message(other)
151
141
  self.first_timestamp ||= self.timestamp
152
142
  self.timestamp = [self.timestamp, other.timestamp].max
@@ -311,14 +301,8 @@ module Logster
311
301
  end
312
302
  end
313
303
 
314
- def truncate_message(msg)
315
- return msg unless msg
316
- msg = msg.inspect unless String === msg
317
- msg.size <= MAX_MESSAGE_LENGTH ? msg : msg[0...MAX_MESSAGE_LENGTH] + "..."
318
- end
319
-
320
304
  def get_timestamp
321
- (Time.new.to_f * 1000).to_i
305
+ (Time.now.to_f * 1000).to_i
322
306
  end
323
307
  end
324
308
  end
@@ -57,7 +57,14 @@ module Logster
57
57
  message << "\nWindow Location: " << params["window_location"] if params["window_location"]
58
58
 
59
59
  backtrace = params["stacktrace"] || ""
60
- Logster.store.report(::Logger::Severity::WARN,
60
+
61
+ severity = ::Logger::Severity::WARN
62
+ if params["severity"] &&
63
+ ::Logger::Severity.const_defined?(params["severity"].upcase)
64
+ severity = ::Logger::Severity.const_get(params["severity"].upcase)
65
+ end
66
+
67
+ Logster.store.report(severity,
61
68
  "javascript",
62
69
  message,
63
70
  backtrace: backtrace,
@@ -48,7 +48,7 @@ module Logster
48
48
  end
49
49
 
50
50
  Logster.store.delete(message)
51
- return [301, { "Location" => "#{@logs_path}/" }, []]
51
+ [301, { "Location" => "#{@logs_path}/" }, []]
52
52
 
53
53
  elsif resource =~ /\/(un)?protect\/([0-9a-f]+)$/
54
54
  off = $1 == "un"
@@ -61,15 +61,15 @@ module Logster
61
61
 
62
62
  if off
63
63
  if Logster.store.unprotect(key)
64
- return [301, { "Location" => "#{@logs_path}/show/#{key}?protected=false" }, []]
64
+ [301, { "Location" => "#{@logs_path}/show/#{key}?protected=false" }, []]
65
65
  else
66
- return [500, {}, ["Failed"]]
66
+ [500, {}, ["Failed"]]
67
67
  end
68
68
  else
69
69
  if Logster.store.protect(key)
70
- return [301, { "Location" => "#{@logs_path}/show/#{key}?protected=true" }, []]
70
+ [301, { "Location" => "#{@logs_path}/show/#{key}?protected=true" }, []]
71
71
  else
72
- return [500, {}, ["Failed"]]
72
+ [500, {}, ["Failed"]]
73
73
  end
74
74
  end
75
75
 
@@ -83,14 +83,14 @@ module Logster
83
83
 
84
84
  Logster.store.solve(key)
85
85
 
86
- return [301, { "Location" => "#{@logs_path}" }, []]
86
+ [301, { "Location" => "#{@logs_path}" }, []]
87
87
 
88
88
  elsif resource =~ /\/clear$/
89
89
  if env[REQUEST_METHOD] != "POST"
90
90
  return method_not_allowed("POST")
91
91
  end
92
92
  Logster.store.clear
93
- return [200, {}, ["Messages cleared"]]
93
+ [200, {}, ["Messages cleared"]]
94
94
 
95
95
  elsif resource =~ /\/show\/([0-9a-f]+)(\.json)?$/
96
96
  key = $1
@@ -179,7 +179,7 @@ module Logster
179
179
  end.first
180
180
  return not_found("No such pattern group exists") if !group
181
181
  group.messages_keys.each { |k| Logster.store.solve(k) }
182
- return [200, {}, []]
182
+ [200, {}, []]
183
183
  elsif resource == '/development-preload.json' && ENV["LOGSTER_ENV"] == "development"
184
184
  [200, { "Content-Type" => "application/json; charset=utf-8" }, [JSON.generate(preloaded_data)]]
185
185
  else
@@ -249,11 +249,11 @@ module Logster
249
249
  envs = {}
250
250
  @redis.eval(
251
251
  BULK_ENV_GET_LUA,
252
- keys: message_keys.map { |k| env_prefix(k) }
252
+ keys: message_keys.map { |k| env_prefix(k, with_namespace: true) }
253
253
  ).to_h.each do |k, v|
254
254
  next if v.size == 0
255
255
  parsed = v.size == 1 ? JSON.parse(v[0]) : v.map { |e| JSON.parse(e) }
256
- envs[env_unprefix(k)] = parsed
256
+ envs[env_unprefix(k, with_namespace: true)] = parsed
257
257
  end
258
258
  end
259
259
  messages = @redis.hmget(hash_key, message_keys).map! do |json|
@@ -647,12 +647,28 @@ module Logster
647
647
  @redis.del(env_prefix(message_key))
648
648
  end
649
649
 
650
- def env_unprefix(key)
651
- key.sub(ENV_PREFIX, "")
650
+ def env_unprefix(key, with_namespace: false)
651
+ prefix = ENV_PREFIX
652
+ if with_namespace && namespace
653
+ prefix = "#{namespace}:#{prefix}"
654
+ end
655
+ key.sub(prefix, "")
656
+ end
657
+
658
+ def env_prefix(key, with_namespace: false)
659
+ prefix = ENV_PREFIX
660
+ if with_namespace && namespace
661
+ prefix = "#{namespace}:#{prefix}"
662
+ end
663
+ prefix + key
652
664
  end
653
665
 
654
- def env_prefix(key)
655
- ENV_PREFIX + key
666
+ def namespace
667
+ if @redis_prefix.respond_to?(:call)
668
+ @namespace ||= @redis_prefix.call
669
+ else
670
+ @namespace ||= @redis_prefix
671
+ end
656
672
  end
657
673
  end
658
674
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Logster
4
- VERSION = "2.6.2"
4
+ VERSION = "2.9.0"
5
5
  end
@@ -8,7 +8,7 @@ require 'logster/version'
8
8
  Gem::Specification.new do |spec|
9
9
  spec.name = "logster"
10
10
  spec.version = Logster::VERSION
11
- spec.authors = ["UI for viewing logs in Rack"]
11
+ spec.authors = ["Sam Saffron"]
12
12
  spec.email = ["sam.saffron@gmail.com"]
13
13
  spec.summary = %q{UI for viewing logs in Rack}
14
14
  spec.description = %q{UI for viewing logs in Rack}
@@ -16,7 +16,7 @@ Gem::Specification.new do |spec|
16
16
  spec.license = "MIT"
17
17
 
18
18
  spec.files = `git ls-files -z`.split("\x0").reject do |f|
19
- f.start_with?("bower_components") || f.start_with?("website") || f.start_with?("bin")
19
+ f.start_with?("website") || f.start_with?("bin")
20
20
  end
21
21
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
22
22
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
@@ -32,7 +32,6 @@ Gem::Specification.new do |spec|
32
32
  spec.add_development_dependency "guard"
33
33
  spec.add_development_dependency "guard-minitest"
34
34
  spec.add_development_dependency "timecop"
35
- spec.add_development_dependency "byebug", "~> 11.0.0"
36
- spec.add_development_dependency "rubocop", "~> 0.69.0"
37
- spec.add_development_dependency "rubocop-discourse"
35
+ spec.add_development_dependency "byebug", "~> 11.1.0"
36
+ spec.add_development_dependency "rubocop-discourse", "~> 2.1.2"
38
37
  end
@@ -11,6 +11,7 @@ class TestReporter < Minitest::Test
11
11
  Logster.store = Logster::RedisStore.new
12
12
  Logster.store.clear_all
13
13
  Logster.config.enable_js_error_reporting = true
14
+ Logster.config.rate_limit_error_reporting = true
14
15
  end
15
16
 
16
17
  def test_logs_errors
@@ -22,6 +23,28 @@ class TestReporter < Minitest::Test
22
23
  assert_equal(1, Logster.store.count)
23
24
  end
24
25
 
26
+ def test_logs_severity_of_errors
27
+ Logster.config.rate_limit_error_reporting = false
28
+
29
+ reporter = Logster::Middleware::Reporter.new(nil)
30
+ env = Rack::MockRequest.env_for("/logs/report_js_error?message=hello")
31
+ status, = reporter.call(env)
32
+
33
+ assert_equal(Logger::Severity::WARN, Logster.store.latest[-1].severity)
34
+
35
+ reporter = Logster::Middleware::Reporter.new(nil)
36
+ env = Rack::MockRequest.env_for("/logs/report_js_error?message=hello&severity=invalid")
37
+ status, = reporter.call(env)
38
+
39
+ assert_equal(Logger::Severity::WARN, Logster.store.latest[-1].severity)
40
+
41
+ reporter = Logster::Middleware::Reporter.new(nil)
42
+ env = Rack::MockRequest.env_for("/logs/report_js_error?message=hello&severity=error")
43
+ status, = reporter.call(env)
44
+
45
+ assert_equal(Logger::Severity::ERROR, Logster.store.latest[-1].severity)
46
+ end
47
+
25
48
  def test_respects_ban_on_errors
26
49
  Logster.config.enable_js_error_reporting = false
27
50
 
@@ -162,4 +162,30 @@ class TestBaseStore < Minitest::Test
162
162
  assert_includes(message.backtrace.lines.first, __method__.to_s)
163
163
  end
164
164
  end
165
+
166
+ def test_log_message_is_truncated_when_above_maximum_message_length
167
+ orig = Logster.config.maximum_message_length
168
+ Logster.config.maximum_message_length = 300
169
+ msg = @store.report(Logger::WARN, '', 'a' * 400)
170
+ # 3 is the ... at the end to indicate truncated message
171
+ assert_equal(300 + 3, msg.message.size)
172
+
173
+ Logster.config.maximum_message_length = 100
174
+ msg = @store.report(Logger::WARN, '', 'a' * 200)
175
+ assert_equal(100 + 3, msg.message.size)
176
+ ensure
177
+ Logster.config.maximum_message_length = orig
178
+ end
179
+
180
+ def test_chained_loggers_shouldnt_mutate_env_passed_to_them
181
+ logger = Logster::Logger.new(@store)
182
+ other_store = Logster::TestStore.new
183
+ other_logger = Logster::Logger.new(other_store)
184
+ logger.chain(other_logger)
185
+ logger.add(Logger::WARN, "this is warning", '', { env: { backtrace: '11' } })
186
+ [@store, other_store].each do |store|
187
+ assert_equal('11', store.reported.first.backtrace)
188
+ refute_includes(store.reported.first.env.keys.map(&:to_sym), :backtrace)
189
+ end
190
+ end
165
191
  end
@@ -10,7 +10,7 @@ class TestGroup < MiniTest::Test
10
10
  end
11
11
 
12
12
  def test_from_json_works_correctly
13
- time = (Time.new.to_f * 1000).to_i - 5000
13
+ time = (Time.now.to_f * 1000).to_i - 5000
14
14
  json = JSON.generate(
15
15
  key: '/somekey/',
16
16
  messages_keys: [111, 222, 333].map(&:to_s),
@@ -20,7 +20,7 @@ class TestMessage < MiniTest::Test
20
20
  end
21
21
 
22
22
  def test_populate_from_env_will_add_time_to_env_unless_it_already_exists
23
- t = (Time.new.to_f * 1000).to_i
23
+ t = (Time.now.to_f * 1000).to_i
24
24
  msg = Logster::Message.new(0, '', 'test', t)
25
25
  msg.populate_from_env({})
26
26
  assert_equal(t, msg.env["time"])
@@ -146,12 +146,6 @@ class TestMessage < MiniTest::Test
146
146
  refute_includes(msg.to_json(exclude_env: true), test_hash.to_json)
147
147
  end
148
148
 
149
- def test_title_is_truncated_when_too_large
150
- msg = Logster::Message.new(0, "", "a" * 1000)
151
- # 3 is the ... at the end to indicate truncated message
152
- assert_equal(600 + 3, msg.message.size)
153
- end
154
-
155
149
  def test_drop_redundant_envs
156
150
  message = Logster::Message.new(Logger::WARN, '', 'message')
157
151
  message.env = [{ a: 4 }] * 10
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logster
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.6.2
4
+ version: 2.9.0
5
5
  platform: ruby
6
6
  authors:
7
- - UI for viewing logs in Rack
7
+ - Sam Saffron
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-02-09 00:00:00.000000000 Z
11
+ date: 2020-06-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -114,42 +114,28 @@ dependencies:
114
114
  requirements:
115
115
  - - "~>"
116
116
  - !ruby/object:Gem::Version
117
- version: 11.0.0
117
+ version: 11.1.0
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
122
  - - "~>"
123
123
  - !ruby/object:Gem::Version
124
- version: 11.0.0
124
+ version: 11.1.0
125
125
  - !ruby/object:Gem::Dependency
126
- name: rubocop
126
+ name: rubocop-discourse
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
129
  - - "~>"
130
130
  - !ruby/object:Gem::Version
131
- version: 0.69.0
131
+ version: 2.1.2
132
132
  type: :development
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
136
  - - "~>"
137
137
  - !ruby/object:Gem::Version
138
- version: 0.69.0
139
- - !ruby/object:Gem::Dependency
140
- name: rubocop-discourse
141
- requirement: !ruby/object:Gem::Requirement
142
- requirements:
143
- - - ">="
144
- - !ruby/object:Gem::Version
145
- version: '0'
146
- type: :development
147
- prerelease: false
148
- version_requirements: !ruby/object:Gem::Requirement
149
- requirements:
150
- - - ">="
151
- - !ruby/object:Gem::Version
152
- version: '0'
138
+ version: 2.1.2
153
139
  description: UI for viewing logs in Rack
154
140
  email:
155
141
  - sam.saffron@gmail.com
@@ -166,12 +152,6 @@ files:
166
152
  - LICENSE.txt
167
153
  - README.md
168
154
  - Rakefile
169
- - assets/fonts/FontAwesome.otf
170
- - assets/fonts/fontawesome-webfont.eot
171
- - assets/fonts/fontawesome-webfont.svg
172
- - assets/fonts/fontawesome-webfont.ttf
173
- - assets/fonts/fontawesome-webfont.woff
174
- - assets/fonts/fontawesome-webfont.woff2
175
155
  - assets/images/Icon-144_rounded.png
176
156
  - assets/images/Icon-144_square.png
177
157
  - assets/images/icon_144x144.png
@@ -236,6 +216,7 @@ files:
236
216
  - client-app/app/templates/settings.hbs
237
217
  - client-app/app/templates/show.hbs
238
218
  - client-app/config/environment.js
219
+ - client-app/config/icons.js
239
220
  - client-app/config/optional-features.json
240
221
  - client-app/config/targets.js
241
222
  - client-app/ember-cli-build.js
@@ -314,7 +295,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
314
295
  - !ruby/object:Gem::Version
315
296
  version: '0'
316
297
  requirements: []
317
- rubygems_version: 3.0.3
298
+ rubygems_version: 3.1.2
318
299
  signing_key:
319
300
  specification_version: 4
320
301
  summary: UI for viewing logs in Rack