logster 1.4.0.pre → 2.0.0.pre
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.rubocop.yml +1 -0
- data/CHANGELOG.md +7 -1
- data/assets/javascript/client-app.js +1 -1
- data/assets/stylesheets/client-app.css +1 -1
- data/client-app/app/styles/app.css +11 -1
- data/lib/examples/sidekiq_logster_reporter.rb +1 -1
- data/lib/logster.rb +1 -1
- data/lib/logster/base_store.rb +20 -6
- data/lib/logster/configuration.rb +1 -1
- data/lib/logster/ignore_pattern.rb +12 -12
- data/lib/logster/logger.rb +3 -3
- data/lib/logster/message.rb +23 -64
- data/lib/logster/middleware/reporter.rb +2 -3
- data/lib/logster/middleware/viewer.rb +16 -16
- data/lib/logster/rails/railtie.rb +0 -1
- data/lib/logster/redis_store.rb +55 -21
- data/lib/logster/version.rb +1 -1
- data/logster.gemspec +1 -0
- data/test/fake_data/generate.rb +1 -1
- data/test/logster/middleware/test_reporter.rb +0 -2
- data/test/logster/middleware/test_viewer.rb +4 -4
- data/test/logster/test_base_store.rb +15 -15
- data/test/logster/test_ignore_pattern.rb +6 -6
- data/test/logster/test_logger.rb +12 -6
- data/test/logster/test_message.rb +40 -14
- data/test/logster/test_redis_store.rb +200 -30
- metadata +17 -2
|
@@ -14,11 +14,13 @@ class TestRedisStore < Minitest::Test
|
|
|
14
14
|
end
|
|
15
15
|
|
|
16
16
|
def test_delete
|
|
17
|
-
|
|
17
|
+
env = { test_env: "this is env" }
|
|
18
|
+
msg = @store.report(Logger::WARN, "test", "testing", env: env)
|
|
18
19
|
@store.delete(msg)
|
|
19
20
|
latest = @store.latest
|
|
20
21
|
|
|
21
|
-
assert_equal(0,latest.length)
|
|
22
|
+
assert_equal(0, latest.length)
|
|
23
|
+
assert_nil(@store.get_env(msg.key))
|
|
22
24
|
end
|
|
23
25
|
|
|
24
26
|
def test_latest
|
|
@@ -78,25 +80,188 @@ class TestRedisStore < Minitest::Test
|
|
|
78
80
|
end
|
|
79
81
|
|
|
80
82
|
def test_get
|
|
81
|
-
|
|
83
|
+
a_env = { "a_message" => "A MESSAGE" }
|
|
84
|
+
a_message = @store.report(Logger::WARN, "test", "A", env: a_env)
|
|
82
85
|
b_message = @store.report(Logger::WARN, "test", "B")
|
|
83
86
|
@store.report(Logger::WARN, "test", "C")
|
|
84
87
|
|
|
85
|
-
|
|
86
|
-
assert_equal("
|
|
88
|
+
a_message = @store.get(a_message.key)
|
|
89
|
+
assert_equal("A", a_message.message)
|
|
90
|
+
assert_equal("B", b_message.message)
|
|
91
|
+
assert(a_env <= a_message.env)
|
|
92
|
+
|
|
93
|
+
a_message = @store.get(a_message.key, load_env: false)
|
|
94
|
+
assert_equal("A", a_message.message)
|
|
95
|
+
assert_nil(a_message.env)
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def test_save_saves_env_separately
|
|
99
|
+
env = { "myenv" => "thisisenv" }
|
|
100
|
+
message = @store.report(Logger::WARN, "test", "title", env: env)
|
|
101
|
+
message = @store.get(message.key, load_env: false)
|
|
102
|
+
assert_nil(message.env)
|
|
103
|
+
|
|
104
|
+
message = @store.get(message.key)
|
|
105
|
+
assert(env <= message.env)
|
|
106
|
+
|
|
107
|
+
assert(env <= @store.get_env(message.key))
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def test_bulk_get
|
|
111
|
+
keys = []
|
|
112
|
+
|
|
113
|
+
5.times do |n|
|
|
114
|
+
env = n == 0 ? nil : { "test_#{n}" => "envsss" }
|
|
115
|
+
keys << @store.report(Logger::WARN, "progname", "test_#{n}", env: env).key
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
messages = @store.bulk_get(keys)
|
|
119
|
+
|
|
120
|
+
5.times do |n|
|
|
121
|
+
msg = messages[n]
|
|
122
|
+
assert_equal("test_#{n}", msg.message)
|
|
123
|
+
if n == 0
|
|
124
|
+
assert_equal(Logster::Message.default_env, msg.env)
|
|
125
|
+
else
|
|
126
|
+
assert({ "test_#{n}" => "envsss" } <= msg.env)
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
def test_get_env
|
|
132
|
+
env = { "my_little_env" => "some value" }
|
|
133
|
+
message = @store.report(Logger::WARN, "test", "A", env: env)
|
|
134
|
+
assert(env <= @store.get_env(message.key))
|
|
135
|
+
assert_nil(@store.get_env("nonexistentkey"))
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
def test_replace_and_bump
|
|
139
|
+
old_env = { "old_env" => "old value" }
|
|
140
|
+
message = @store.report(Logger::WARN, "test", "A", env: old_env)
|
|
141
|
+
|
|
142
|
+
unsaved_env = { "unsaved_env" => "lost value" }
|
|
143
|
+
message.env = unsaved_env
|
|
144
|
+
|
|
145
|
+
@store.replace_and_bump(message, save_env: false)
|
|
146
|
+
|
|
147
|
+
message = @store.get(message.key)
|
|
148
|
+
assert(old_env <= message.env)
|
|
149
|
+
refute(unsaved_env <= message.env)
|
|
150
|
+
|
|
151
|
+
saved_env = { "saved_env" => "saved value!" }
|
|
152
|
+
message.env = saved_env
|
|
153
|
+
|
|
154
|
+
@store.replace_and_bump(message)
|
|
155
|
+
|
|
156
|
+
message = @store.get(message.key)
|
|
157
|
+
assert(saved_env == message.env)
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
def test_backward_compatibility_no_loss_of_data
|
|
161
|
+
# previously we were storing env samples as a part of the main message json
|
|
162
|
+
# now we've switched to storing samples separately from the main message
|
|
163
|
+
# we need to make we don't lose env data of messages stored the old way
|
|
164
|
+
# when we migrate to the new system
|
|
165
|
+
|
|
166
|
+
# it probably makes sense to remove this test after a while (say 6-12 months)
|
|
167
|
+
|
|
168
|
+
Logster.config.allow_grouping = true
|
|
169
|
+
backtrace = "fake backtrace"
|
|
170
|
+
env = { "some_env" => "some env" }
|
|
171
|
+
message = Logster::Message.new(Logger::WARN, "", "title", count: 60)
|
|
172
|
+
message.env = env
|
|
173
|
+
message.backtrace = backtrace
|
|
174
|
+
|
|
175
|
+
@store.save(message)
|
|
176
|
+
|
|
177
|
+
# hack to force env to be stored with the main message json
|
|
178
|
+
@store.redis.hset(@store.send("hash_key"), message.key, message.to_json(exclude_env: false))
|
|
179
|
+
|
|
180
|
+
another_env = { "another_env" => "more env" }
|
|
181
|
+
message = @store.report(Logger::WARN, "", "title", backtrace: backtrace, env: another_env)
|
|
182
|
+
message = @store.get(message.key)
|
|
183
|
+
|
|
184
|
+
assert(env <= message.env)
|
|
185
|
+
assert_equal(61, message.count)
|
|
186
|
+
# another_env is not merged cause count is 60, only the count is updated
|
|
187
|
+
|
|
188
|
+
# make sure we are now storing env samples separately
|
|
189
|
+
message = @store.get(message.key, load_env: false)
|
|
190
|
+
assert_nil(message.env)
|
|
191
|
+
ensure
|
|
192
|
+
Logster.config.allow_grouping = false
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
def test_backward_compatibility_no_loss_of_data_2
|
|
196
|
+
# same story as the test above, just a bit different
|
|
197
|
+
|
|
198
|
+
Logster.config.allow_grouping = true
|
|
199
|
+
backtrace = "fake backtrace"
|
|
200
|
+
env = { "some_env" => "some env" }
|
|
201
|
+
message = Logster::Message.new(Logger::WARN, "", "title")
|
|
202
|
+
message.env = env
|
|
203
|
+
message.backtrace = backtrace
|
|
204
|
+
|
|
205
|
+
@store.save(message)
|
|
206
|
+
|
|
207
|
+
# hack to force env to be stored with the main message json
|
|
208
|
+
@store.redis.hset(@store.send("hash_key"), message.key, message.to_json(exclude_env: false))
|
|
209
|
+
|
|
210
|
+
another_env = { "another_env" => "more env" }
|
|
211
|
+
message = @store.report(Logger::WARN, "", "title", backtrace: backtrace, env: another_env)
|
|
212
|
+
message = @store.get(message.key)
|
|
213
|
+
|
|
214
|
+
assert_instance_of(Array, message.env)
|
|
215
|
+
assert(env <= message.env[0])
|
|
216
|
+
assert(another_env <= message.env[1])
|
|
217
|
+
assert_equal(2, message.env.size)
|
|
218
|
+
assert_equal(2, message.count)
|
|
219
|
+
|
|
220
|
+
# make sure we are now storing env samples separately
|
|
221
|
+
message = @store.get(message.key, load_env: false)
|
|
222
|
+
assert_nil(message.env)
|
|
223
|
+
ensure
|
|
224
|
+
Logster.config.allow_grouping = false
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
def test_merging_performance
|
|
228
|
+
Logster.config.allow_grouping = true
|
|
229
|
+
backtrace = "fake backtrace"
|
|
230
|
+
env = { "some_env" => "some env" }
|
|
231
|
+
another_env = { "another_env" => "more env" }
|
|
232
|
+
yet_another_env = { "moaar_env" => "more env" }
|
|
233
|
+
|
|
234
|
+
@store.report(Logger::WARN, "", "title", backtrace: backtrace, env: env, count: 49)
|
|
235
|
+
|
|
236
|
+
message = @store.report(Logger::WARN, "", "title", backtrace: backtrace, env: another_env)
|
|
237
|
+
assert_instance_of(Array, message.env)
|
|
238
|
+
assert_equal(2, message.env.size)
|
|
239
|
+
assert(env <= message.env[0])
|
|
240
|
+
assert(another_env <= message.env[1])
|
|
241
|
+
|
|
242
|
+
message = @store.report(Logger::WARN, "", "title", backtrace: backtrace, env: yet_another_env)
|
|
243
|
+
# we don't need to load env from redis cause we don't
|
|
244
|
+
# need to merge new env samples if count is 50 or more
|
|
245
|
+
assert_nil(message.env)
|
|
246
|
+
ensure
|
|
247
|
+
Logster.config.allow_grouping = false
|
|
87
248
|
end
|
|
88
249
|
|
|
89
250
|
def test_backlog
|
|
251
|
+
env = { "backlog_test" => "BACKLOG" }
|
|
90
252
|
@store.max_backlog = 1
|
|
253
|
+
deleted_msg = @store.report(Logger::WARN, "test", "A")
|
|
91
254
|
@store.report(Logger::WARN, "test", "A")
|
|
92
255
|
@store.report(Logger::WARN, "test", "A")
|
|
93
|
-
@store.report(Logger::WARN, "test", "
|
|
94
|
-
@store.report(Logger::WARN, "test", "B")
|
|
256
|
+
@store.report(Logger::WARN, "test", "B", env: env)
|
|
95
257
|
|
|
96
258
|
latest = @store.latest
|
|
97
259
|
|
|
98
260
|
assert_equal(1, latest.length)
|
|
99
261
|
assert_equal("B", latest[0].message)
|
|
262
|
+
assert(env <= latest[0].env)
|
|
263
|
+
assert_nil(@store.get(deleted_msg.key))
|
|
264
|
+
assert_nil(@store.get_env(deleted_msg.key))
|
|
100
265
|
end
|
|
101
266
|
|
|
102
267
|
def test_save_unsave
|
|
@@ -127,17 +292,18 @@ class TestRedisStore < Minitest::Test
|
|
|
127
292
|
end
|
|
128
293
|
|
|
129
294
|
def test_clear
|
|
295
|
+
env = { "clear_env" => "cllleear" }
|
|
130
296
|
@store.max_backlog = 25
|
|
131
|
-
a_message = @store.report(Logger::WARN, "test", "A", timestamp: Time.now - (24*60*60))
|
|
297
|
+
a_message = @store.report(Logger::WARN, "test", "A", timestamp: Time.now - (24 * 60 * 60), env: env)
|
|
132
298
|
@store.protect a_message.key
|
|
133
299
|
20.times do
|
|
134
|
-
@store.report(Logger::WARN, "test", "B")
|
|
300
|
+
@store.report(Logger::WARN, "test", "B", env: env)
|
|
135
301
|
end
|
|
136
|
-
c_message = @store.report(Logger::WARN, "test", "C", timestamp: Time.now + (24*60*60))
|
|
302
|
+
c_message = @store.report(Logger::WARN, "test", "C", timestamp: Time.now + (24 * 60 * 60), env: env)
|
|
137
303
|
@store.protect c_message.key
|
|
138
|
-
d_message = @store.report(Logger::WARN, "test", "D")
|
|
304
|
+
d_message = @store.report(Logger::WARN, "test", "D", env: env)
|
|
139
305
|
10.times do
|
|
140
|
-
@store.report(Logger::WARN, "test", "E")
|
|
306
|
+
@store.report(Logger::WARN, "test", "E", env: env)
|
|
141
307
|
end
|
|
142
308
|
|
|
143
309
|
latest = @store.latest
|
|
@@ -147,8 +313,10 @@ class TestRedisStore < Minitest::Test
|
|
|
147
313
|
|
|
148
314
|
# Protected messages are still accessible by their key
|
|
149
315
|
assert_equal("C", @store.get(c_message.key).message)
|
|
316
|
+
assert(env <= @store.get_env(c_message.key))
|
|
150
317
|
# Unprotected messages are gone
|
|
151
318
|
assert_nil(@store.get(d_message.key))
|
|
319
|
+
assert_nil(@store.get_env(d_message.key))
|
|
152
320
|
|
|
153
321
|
# The latest list is rebuilt with protected messages, earliest first
|
|
154
322
|
# Including messages that previously fell off (A)
|
|
@@ -156,6 +324,8 @@ class TestRedisStore < Minitest::Test
|
|
|
156
324
|
assert_equal(2, latest.length)
|
|
157
325
|
assert_equal("A", latest[0].message)
|
|
158
326
|
assert_equal("C", latest[1].message)
|
|
327
|
+
assert(env <= latest[0].env)
|
|
328
|
+
assert(env <= latest[1].env)
|
|
159
329
|
end
|
|
160
330
|
|
|
161
331
|
def test_hash_cleanup
|
|
@@ -194,7 +364,7 @@ class TestRedisStore < Minitest::Test
|
|
|
194
364
|
@store.report(Logger::ERROR, "test", "E")
|
|
195
365
|
# respects after
|
|
196
366
|
latest = @store.latest(severity: [Logger::ERROR, Logger::WARN], limit: 2, after: latest[1].key)
|
|
197
|
-
assert_equal(1, latest.length)
|
|
367
|
+
assert_equal(1, latest.length)
|
|
198
368
|
end
|
|
199
369
|
|
|
200
370
|
def test_search
|
|
@@ -277,9 +447,9 @@ class TestRedisStore < Minitest::Test
|
|
|
277
447
|
# any hashes that don't match should be stripped from the env
|
|
278
448
|
# array but only temporarily until it's sent to the client
|
|
279
449
|
# env array should remain untouched in redis memory
|
|
280
|
-
assert_equal(["business5"], messages[0].env.map { |env| env["cluster"]})
|
|
450
|
+
assert_equal(["business5"], messages[0].env.map { |env| env["cluster"] })
|
|
281
451
|
assert_equal(1, messages[0].count)
|
|
282
|
-
assert_equal(["business2"], messages[1].env.map { |env| env["cluster"]})
|
|
452
|
+
assert_equal(["business2"], messages[1].env.map { |env| env["cluster"] })
|
|
283
453
|
assert_equal(1, messages[1].count)
|
|
284
454
|
|
|
285
455
|
m1 = @store.get(m1_key)
|
|
@@ -309,7 +479,7 @@ class TestRedisStore < Minitest::Test
|
|
|
309
479
|
@store.ignore = [
|
|
310
480
|
Logster::IgnorePattern.new("business")
|
|
311
481
|
]
|
|
312
|
-
|
|
482
|
+
@store.report(Logger::WARN, "", "my error", env: { cluster: "business17", backtrace: backtrace })
|
|
313
483
|
|
|
314
484
|
message = @store.get(message.key)
|
|
315
485
|
assert(Array === message.env)
|
|
@@ -335,9 +505,9 @@ class TestRedisStore < Minitest::Test
|
|
|
335
505
|
messages = @store.latest(search: "-business")
|
|
336
506
|
assert_equal(2, messages.size)
|
|
337
507
|
|
|
338
|
-
assert_equal(["standard3"], messages[0].env.map { |env| env["cluster"]})
|
|
508
|
+
assert_equal(["standard3"], messages[0].env.map { |env| env["cluster"] })
|
|
339
509
|
assert_equal(1, messages[0].count)
|
|
340
|
-
assert_equal(["standard7"], messages[1].env.map { |env| env["cluster"]})
|
|
510
|
+
assert_equal(["standard7"], messages[1].env.map { |env| env["cluster"] })
|
|
341
511
|
assert_equal(1, messages[1].count)
|
|
342
512
|
end
|
|
343
513
|
|
|
@@ -385,7 +555,7 @@ class TestRedisStore < Minitest::Test
|
|
|
385
555
|
assert_equal(1, @store.latest.count)
|
|
386
556
|
|
|
387
557
|
@store.report(Logger::WARN, "application", "test error1", backtrace: "backtrace1")
|
|
388
|
-
@store.report(Logger::WARN, "application", "test error1", backtrace: "backtrace1", env: { "application_version" => "xyz"})
|
|
558
|
+
@store.report(Logger::WARN, "application", "test error1", backtrace: "backtrace1", env: { "application_version" => "xyz" })
|
|
389
559
|
|
|
390
560
|
assert_equal(2, @store.latest.count)
|
|
391
561
|
|
|
@@ -395,15 +565,15 @@ class TestRedisStore < Minitest::Test
|
|
|
395
565
|
|
|
396
566
|
def test_solve_grouped
|
|
397
567
|
Logster.config.allow_grouping = true
|
|
398
|
-
@store.report(Logger::WARN, "application", "test error1", backtrace: "backtrace1", env: { "application_version" => "xyz"})
|
|
399
|
-
m = @store.report(Logger::WARN, "application", "test error1", backtrace: "backtrace1", env: { "application_version" => "efg"})
|
|
568
|
+
@store.report(Logger::WARN, "application", "test error1", backtrace: "backtrace1", env: { "application_version" => "xyz" })
|
|
569
|
+
m = @store.report(Logger::WARN, "application", "test error1", backtrace: "backtrace1", env: { "application_version" => "efg" })
|
|
400
570
|
|
|
401
571
|
assert_equal(1, @store.latest.count)
|
|
402
572
|
|
|
403
573
|
@store.solve(m.key)
|
|
404
574
|
|
|
405
|
-
@store.report(Logger::WARN, "application", "test error1", backtrace: "backtrace1", env: { "application_version" => "xyz"})
|
|
406
|
-
@store.report(Logger::WARN, "application", "test error1", backtrace: "backtrace1", env: { "application_version" => "efg"})
|
|
575
|
+
@store.report(Logger::WARN, "application", "test error1", backtrace: "backtrace1", env: { "application_version" => "xyz" })
|
|
576
|
+
@store.report(Logger::WARN, "application", "test error1", backtrace: "backtrace1", env: { "application_version" => "efg" })
|
|
407
577
|
|
|
408
578
|
assert_equal(0, @store.latest.count)
|
|
409
579
|
|
|
@@ -412,7 +582,7 @@ class TestRedisStore < Minitest::Test
|
|
|
412
582
|
end
|
|
413
583
|
|
|
414
584
|
def test_clears_solved
|
|
415
|
-
m = @store.report(Logger::WARN, "application", "test error2", backtrace: "backtrace1", env: {"application_version" => "abc"})
|
|
585
|
+
m = @store.report(Logger::WARN, "application", "test error2", backtrace: "backtrace1", env: { "application_version" => "abc" })
|
|
416
586
|
@store.solve(m.key)
|
|
417
587
|
|
|
418
588
|
assert_equal(1, @store.solved.length)
|
|
@@ -423,7 +593,7 @@ class TestRedisStore < Minitest::Test
|
|
|
423
593
|
|
|
424
594
|
def test_solving_with_some_missing_version
|
|
425
595
|
|
|
426
|
-
m
|
|
596
|
+
m = @store.report(Logger::WARN, "application", "test error1", backtrace: "backtrace1", env: { "application_version" => "xyz" })
|
|
427
597
|
@store.report(Logger::WARN, "application", "test error1", backtrace: "backtrace1")
|
|
428
598
|
|
|
429
599
|
@store.solve(m.key)
|
|
@@ -432,17 +602,17 @@ class TestRedisStore < Minitest::Test
|
|
|
432
602
|
end
|
|
433
603
|
|
|
434
604
|
def test_env
|
|
435
|
-
env = Rack::MockRequest.env_for("/test").merge(
|
|
605
|
+
env = Rack::MockRequest.env_for("/test").merge(
|
|
436
606
|
"HTTP_HOST" => "www.site.com",
|
|
437
607
|
"HTTP_USER_AGENT" => "SOME WHERE"
|
|
438
|
-
|
|
608
|
+
)
|
|
439
609
|
orig = env.dup
|
|
440
610
|
orig["test"] = "tests"
|
|
441
611
|
orig["test1"] = "tests1"
|
|
442
|
-
Logster.add_to_env(env,"test","tests")
|
|
443
|
-
Logster.add_to_env(env,"test1","tests1")
|
|
612
|
+
Logster.add_to_env(env, "test", "tests")
|
|
613
|
+
Logster.add_to_env(env, "test1", "tests1")
|
|
444
614
|
|
|
445
|
-
orig.delete_if do |k,v|
|
|
615
|
+
orig.delete_if do |k, v|
|
|
446
616
|
!%w{
|
|
447
617
|
HTTP_HOST
|
|
448
618
|
REQUEST_METHOD
|
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:
|
|
4
|
+
version: 2.0.0.pre
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- UI for viewing logs in Rack
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2019-01-
|
|
11
|
+
date: 2019-01-17 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|
|
@@ -122,6 +122,20 @@ dependencies:
|
|
|
122
122
|
- - ">="
|
|
123
123
|
- !ruby/object:Gem::Version
|
|
124
124
|
version: '0'
|
|
125
|
+
- !ruby/object:Gem::Dependency
|
|
126
|
+
name: rubocop
|
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
|
128
|
+
requirements:
|
|
129
|
+
- - "~>"
|
|
130
|
+
- !ruby/object:Gem::Version
|
|
131
|
+
version: 0.61.1
|
|
132
|
+
type: :development
|
|
133
|
+
prerelease: false
|
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
135
|
+
requirements:
|
|
136
|
+
- - "~>"
|
|
137
|
+
- !ruby/object:Gem::Version
|
|
138
|
+
version: 0.61.1
|
|
125
139
|
description: UI for viewing logs in Rack
|
|
126
140
|
email:
|
|
127
141
|
- sam.saffron@gmail.com
|
|
@@ -130,6 +144,7 @@ extensions: []
|
|
|
130
144
|
extra_rdoc_files: []
|
|
131
145
|
files:
|
|
132
146
|
- ".gitignore"
|
|
147
|
+
- ".rubocop.yml"
|
|
133
148
|
- ".travis.yml"
|
|
134
149
|
- CHANGELOG.md
|
|
135
150
|
- Gemfile
|